Я должен определить, является ли выбранный UIColor (выбранный пользователем) темным или ярким, таким образом, я могу изменить цвет строки текста, который находится к тому же цвет для лучшей удобочитаемости.
Вот пример в Flash/Actionscript (с демонстрацией): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
Какие-либо мысли?
С наилучшими пожеланиями, Andre
ОБНОВЛЕНИЕ
Благодаря общим предложениям вот рабочий код:
- (void) updateColor:(UIColor *) newColor
{
const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5)
{
NSLog(@"my color is dark");
}
else
{
NSLog(@"my color is light");
}
}
Спасибо еще раз :)
У W3C есть следующее: http://www.w3.org/WAI/ER/WD-AERT/# цвет-контраст
Если вы делаете только черный или белый текст, используйте расчет яркости цвета выше. Если ниже 125, используйте белый текст. Если 125 или выше, используйте черный текст.
редактировать 1: сдвиг в сторону черного текста. :)
редактировать 2: Используемая формула: ((значение красного цвета * 299) + (значение зеленого цвета * 587) + (значение синего цвета * 114)) / 1000.
Если вы хотите найти яркость цвета, вот некоторый псевдокод:
public float GetBrightness(int red, int blue, int green)
{
float num = red / 255f;
float num2 = blue / 255f;
float num3 = green / 255f;
float num4 = num;
float num5 = num;
if (num2 > num4)
num4 = num2;
if (num3 > num4)
num4 = num3;
if (num2 < num5)
num5 = num2;
if (num3 < num5)
num5 = num3;
return ((num4 + num5) / 2f);
}
Если он> 0,5, он яркий, в противном случае - темный.
Для всего, что не является серым, инверсия цвета RGB обычно сильно контрастирует с этим. Демонстрация просто инвертирует цвет и обесцвечивает его (преобразует его в серый).
Но создать приятную успокаивающую комбинацию цветов довольно сложно. Посмотрите на:
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/