Сделайте foregroundcolor черный цвет или белый цвет в зависимости от фона

Что-то как вычисление среднего значения rgb компонентов и затем решает, использовать ли черный или белый?

Я должен преобразовать RGB в HSV в первом шаге, потому что RGB не всегда, что видят человеческие глаза?

Я использую C#

34
задан Kai 11 February 2010 в 01:04
поделиться

5 ответов

что насчет этого?

private static Color GetReadableForeColor(Color c)
{
    return (((c.R + c.B + c.G) / 3) > 128) ? Color.Black : Color.White;
}
6
ответ дан 27 November 2019 в 16:25
поделиться

Так получилось, что не так давно мне понадобилась эта функция для одного проекта.

private int PerceivedBrightness(Color c)
{
    return (int)Math.Sqrt(
    c.R * c.R * .241 +
    c.G * c.G * .691 +
    c.B * c.B * .068);
}

Эту формулу я нашел в Интернете на сайте Nbd Tech, посвященном воспринимаемым цветам и формуле преобразования цветов. Сайт дает много полезной информации.

Вот как использовать это для выбора черного или белого:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White);

Вы можете использовать значение, отличное от 130, в качестве отсечки; это предпочтение.


Обновление: Согласно Дарелу Рексу Финли на его сайте:

Значения, которые я придумал, играя с Photoshop, были .241, .691 и .068, но с тех пор мне сообщили, что значения .299, .587 и .114 являются более точными.

Эта спецификация соответствует Рекомендации ITU-R BT.601 (или Rec. 601 для краткости). Сайт, который я упоминал выше, Nbd Tech, еще не был обновлен, чтобы отразить это.

Исходя из этого, вот обновленный метод (спасибо DTI-Matt за комментарий):

private int PerceivedBrightness(Color c)
{
    return (int)Math.Sqrt(
    c.R * c.R * .299 +
    c.G * c.G * .587 +
    c.B * c.B * .114);
}

Примечание о пороговых предпочтениях:

Цвета с воспринимаемой яркостью около середины (например, 120-140) будут более субъективными. Например, спорно, какой красный (FF0000), который оценивается в 139, будет более четким с черным или белым наложением.

White and Black on Red

68
ответ дан 27 November 2019 в 16:25
поделиться

Вы можете сделать простой расчет в зависимости от глубины цвета, если, скажем, у вас есть цветовой формат #FFFFFF, вы можете просто сложить значения RGB и рассчитать, если они ниже половины пути.

Максимум в этом случае - 255 (F x F = 256) на, поэтому просто проверьте, не находится ли он ниже этого порога:

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000";

Если цвет ниже, он темнее... используйте белый фон. Если цвет выше, то он светлее... используйте черный фон. Это не идеальный вариант, но идея для начала.

0
ответ дан 27 November 2019 в 16:25
поделиться

Сначала объявите «частное свойство» с помощью стандартного метода расширения класса:

// VisualNotePlayer.h
@interface VisualNotePlayer : NSObject<NotePlayer>{
    @private
    UIView *_currentView;
}

// VisualNotePlayer.m
@interface VisualNotePlayer()
@property (nonatomic, retain) UIView *currentView;
@end

@implementation VisualNotePlayer
@synthesize currentView=_currentView;
...
@end

Затем заново создайте свойства в категории:

// VisualNotePlayer+Views.h
@interface VisualNotePlayer(Views)
@property (nonatomic, retain) UIView *currentView;
@end

Этот интерфейс доступен только для тех, кто импортирует StartNotePlayer + Views.h

-121--259719-

GetHashCode предназначен для использования Если вам нужно создать действительно уникальный ключ, GetHashCode является разумной отправной точкой (и не слишком длинной, как guid), но вам нужно будет сохранить ключ как часть объекта и вести список используемых ключей отдельно.

Хотя вы можете получить что-то, что выглядит пригодным для использования из внутренних элементов словаря, это, вероятно, не будет работать надежно - например, если вы добавите больше предметы, чем словарь был первоначально выделен для обработки, базовая структура данных будет перестроена, и отдельные предметы могут оказаться в совершенно другой части словаря.

-121--2595357-

Если я правильно понимаю, один из подходов может заключаться в том, чтобы получить изображение обоев рабочего стола, проверить, какой это цвет, а затем изменить цвет вашего приложения на основе этого.

Есть статья в geekpedia о получении текущих обоев рабочего стола (и много попаданий в Google на этом), но основная предпосылка состоит в том, чтобы захватить регистрационное значение текущих обоев:

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false);
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString();

Затем вы можете использовать этот путь, чтобы открыть изображение. Затем можно получить множество свойств, таких как размеры и цвета отдельных пикселей в RGB.

Чтобы выяснить, «более белый» или «более черный», у вас есть много вариантов.

Одна идея состояла бы в том, чтобы добраться, каждый пиксель раскрашивают RGB, составляют в среднем ценности (чтобы получить стоимость серой шкалы) и затем составить в среднем стоимость серой шкалы каждого пикселя через изображение. Если это выйдет > 128 то это может быть условлено, чтобы быть «белым». Если < 128, то «черный». В основном вы решаете, с какой стороны средней серой разделительной линии изображения пиксельные интенсивности усреднены до.

// Psudo code - can't check the C# spec atm.
foreach(Pixel p in image)
{
    // get average of colour components.
    double greyScale = (p.Red + p.Green + p.Blue) / 3;
    totalIntensity += greyScale;
}

double averageImageIntensity = totalIntensity / image.NumPixels;

if(totalIntensity > 128) // image could be considered to be "white"
else // image could be considered "black".

Проблемы: может быть медленная процедура, вы можете попробовать только некоторые из пикселей (например, каждый десятый и т.д.), чтобы сэкономить время. В более общем, это кажется довольно хакерским делом вообще. Извлечение пользовательских файлов во время выполнения и смешение с ними вряд ли является чистым, и это обеспечивает потенциальные проблемы безопасности и стабильности. Что, если изображение дух или коррумпировано и т.д.

Лично я бы предложил просто дать пользователю выбор цвета/темы/кожи сами, или лучше все же позволить им настроить его!

-1
ответ дан 27 November 2019 в 16:25
поделиться

Структура Color изначально поддерживает преобразование в HSB.

if (Color.GetBrightness() > 0.5f) {
  // win
}

Вы также можете добавить компонент насыщенности, учитывая, что насыщенность также вносит свой вклад в кажущуюся «легкость».

5
ответ дан 27 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: