Nesne için oldukça yeni ama bir süredir programlama yapıyorum. RGB'den HSL'ye ve tekrar geri dönecek bir işlev oluşturmaya başladım, ancak çok uzun bir yol olduğunu ve yanlış yöne gittiğini hissediyorum. Bu dönüşümü gerçekleştirmenin basit bir yolu bilen var mı?Hedef C ile RGB'den HSL'ye Dönüştürme
cevap
NSColor
'u kullanabilirsiniz, bence.
CGFloat r, g, b, a, h, s, b, a2;
NSColor *c = [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
[c getHue:&h saturation:&s brightness:&b alpha:&a2];
, ben NSColor
iPhone çerçeveler mevcut olup olmadığını bilmiyorum - bir UIColor
yok? Her neyse, bir OS X çözümü arayan birinin burada biter olması durumunda bu cevabı bırakacağım.
UIColor'a ton, doygunluk ve değer ile çalışmak için bir işlem kümesi eklemek için UIColor-HSVAdditions.h/.m kategorisini uygulamanıza ekleyebilirsiniz. Ayrıca, http://bravobug.com/news/?p=448 ve numaralı makalede de bu ArsTechnica makalesine bakın. IPhone SDK'da NSColor eksik
kullanıyorum ne::
static void RVNColorRGBtoHSL(CGFloat red, CGFloat green, CGFloat blue, CGFloat *hue, CGFloat *saturation, CGFloat *lightness)
{
CGFloat r = red/255.0f;
CGFloat g = green/255.0f;
CGFloat b = blue/255.0f;
CGFloat max = MAX(r, g);
max = MAX(max, b);
CGFloat min = MIN(r, g);
min = MIN(min, b);
CGFloat h;
CGFloat s;
CGFloat l = (max + min)/2.0f;
if (max == min) {
h = 0.0f;
s = 0.0f;
}
else {
CGFloat d = max - min;
s = l > 0.5f ? d/(2.0f - max - min) : d/(max + min);
if (max == r) {
h = (g - b)/d + (g < b ? 6.0f : 0.0f);
}
else if (max == g) {
h = (b - r)/d + 2.0f;
}
else if (max == b) {
h = (r - g)/d + 4.0f;
}
h /= 6.0f;
}
if (hue) {
*hue = roundf(h * 255.0f);
}
if (saturation) {
*saturation = roundf(s * 255.0f);
}
if (lightness) {
*lightness = roundf(l * 255.0f);
}
}
Ve burada diyoruz için:
CGFloat h, s, l;
RVNColorRGBtoHSL(r, g, b,
&h, &s, &l);
Sen HSL alanı ve arka RGB dönüştürmek için bu programı kullanabilirsiniz
Teşekkürler! 'NSColor' kullanmadan çok daha hızlı çalışır. – VinceFior
Güncelleştirme: Bu işlev, aslında gerektiğinden farklı ton değerleri döndürür. Bir renk tekerleğinden farklı ton aralıkları seçmek için kullandığımda, etrafında atlar. Tersine, aşağıdaki çözüm beklediğim gibi renk tekerleği etrafında döner: http://stackoverflow.com/a/6930407/1976584 – VinceFior
- 1. Amaç-C Sorunları UIWebView ile PDF'ye dönüştürme
- 2. Anahtarları/değerleri JSON c ile dönüştürme. #
- 3. jQuery ile Hedef IE7
- 4. MonoTouch üzerindeki Hedef C bağlaması
- 5. Hedef c isKindOfClass missunderstanding mı?
- 6. Fortran90 - C# Dönüştürme Sayı
- 7. dönüştürme Mat ve C/C++
- 8. C++ kodunu C# koduna dönüştürme
- 9. Managed C++ ile C++/CLI arasında dönüştürme araçları var mı?
- 10. Programlı olarak PayPal ile ödeme yapın Hedef C
- 11. Hedef C ile OSX'te Dağıtılmış Nesne Bağlantılarının Test Edilmesi
- 12. C# Listelemelere hashtag dönüştürme
- 13. Dize datetime dönüştürme C#
- 14. Dönüştürme Lisp C++
- 15. Çifti C++ dizesine dönüştürme
- 16. Scala örtülü dönüştürme, hedefe yönelik olmayan hedef üzerinde gerçekleştirilmiyor
- 17. C# Kitaplığı MSTest Project'e Dönüştürme
- 18. C# DateTime'ı Javascript Tarihine Dönüştürme
- 19. Qt C++ QByteArray Dönüştürme QString
- 20. Dolaylı bir işaretçinin ARC ile hedef-c işaretçisine dolaylı olarak dönüştürülmesi
- 21. Hedef-c kategorisinde bir func ekleme
- 22. Yol için bileşenler ekleme - Hedef C
- 23. C#: System.Reflection.MethodInfo neden: (Nesne eşleşmiyor hedef türü)
- 24. alma NSArray uzunluğu/sayımı - Hedef C
- 25. Bu hedef-c kodunun eşdeğeri ne kadardır?
- 26. Apple Mach-O Bağlayıcı Hatası - Hedef C
- 27. Hedef C - Global statik değişkenleri nerede karşılarsınız?
- 28. Firebase'den nasıl çıkış yapıyorsunuz? (Hedef C)
- 29. C emguCV kullanarak gri tonlama dönüştürme C#
- 30. Bayt dizisini C dizgisine dönüştürme C#
+1, HSL HSB/HSV ile aynı değildir. Yine de, H ve S aynı olmalıdır. – Wevah
@Wevah, wikipedia çok standartlaştırılmadığını ve isimlerden herhangi birinin modellerin herhangi biriyle gidebileceğini söylüyor. Ancak incelikleri bilmek için bir uzman yeterli değilim. –
Eh, onlar standart * sort *. Neredeyse. Çoğunlukla, yerleşik şeylerin HSL (ightness) ile baş etmemesi talihsiz bir durumdur. : Ve eğer gerçekten HSV/HSB'yi istiyorsa, cevabınız mükemmel! – Wevah