التحويل من RGB إلى HSL مع الهدف ج
-
26-09-2019 - |
سؤال
أنا جديد تمامًا في الهدف C ولكن لقد تم برمجة لفترة من الوقت. بدأت في إنشاء وظيفة من شأنها تحويل من RGB إلى HSL والعودة مرة أخرى ، لكنني أشعر أنها طويلة جدًا وتوجه في الاتجاه الخاطئ. هل يعرف أي شخص طريقة بسيطة لأداء هذا التحويل؟
المحلول
NSCOLOR مفقود في iPhone SDK. يمكنك استخدام هذه الأداة المساعدة للتحويل من RGB إلى مساحة HSL والعودة:
نصائح أخرى
يمكنك استخدام NSColor
, ، أظن.
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];
في الفكر الثاني ، لا أعرف إذا NSColor
متوفر في أطر عمل iPhone أم لا - أليس كذلك UIColor
؟ على أي حال ، سأترك هذه الإجابة في حالة انتهاء شخص ما يبحث عن حل OS X هنا.
هذا ما أستخدمه:
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);
}
}
وهنا كيف تسميها:
CGFloat h, s, l;
RVNColorRGBtoHSL(r, g, b,
&h, &s, &l);
يمكنك إضافة فئة UICOLOR-HSVADDITITIONS.H/.M إلى تطبيقك لإضافة مجموعة من العمليات إلى UICOLOR للعمل مع التشبع والقيمة. يرى http://bravobug.com/news/؟p=448 وهذاarstechnica مقال أيضا.