Цветовая модель HSV(HSB). Перевод из RGB

147
06 марта 2018, 01:21

Недавно сталкнулся с задачей, в одном элементе которой требовалось преобразование

rgb -> hsv.

Вначале хотелось сделать всё по общеизвестным формулам: https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)

Но после увидел, что в System.Drawing.Color для этого имеются специальные методы, которые возвращают нужные мне параметры:

GetHue() - Gets the hue-saturation-brightness (HSB) hue value, in degrees, for this Color structure. GetSaturation() - Gets the hue-saturation-brightness (HSB) saturation value for this Color structure. GetBrightness() - Gets the hue-saturation-brightness (HSB) brightness value for this Color structure.

Казалось, что дело в шляпе, но не тут то было, поскольку, как видно по формулам, для чистых цветов, к примеру RGB(255,0,0), параметр B, то есть яркость, должен быть 100%, однако на деле, черезе метод GetBrightness() выходит лишь 50%. Далее решил глянуть реализацию данных методов (что бы убедиться, что я не спятил): https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Color.cs,23adaaa39209cc1f

как видно, возвращается не [max(r,g,b) / 255] * 100% , а среднее между максимальным и минимальным так где же я неправ? или откуда взялись странные формулы, по которым реализованны данные методы, м.б. это ошибка разработчиков или же ошибаюсь я?

Answer 1

Добрый человек, Kromster, в коментарии упомянул про модель HSL и вот оно! хоть в документации и написано, что данные методы возвращают параметры для модели HSB, однако значения считаются как раз таки для модели HSL.

READ ALSO
Каковы преимущества/недостатки Nemerle по сравнению с С#? [требует правки]

Каковы преимущества/недостатки Nemerle по сравнению с С#? [требует правки]

Здравствуйте! Большую часть времени я пишу на С#, но мне всегда не хватало в этом прекрасном языке макросов (однажды попробовав макросы LISP, трудно...

149
ChannelFactory очистка данных

ChannelFactory очистка данных

При передаче большого объема данных в WCF службу, передаваемое приложение начинает безмерно потреблять ОЗУ 240>364>478>797 Мб и тд

139
Обработка координат

Обработка координат

Я хочу запускать скрипт, когда мой объект в юнити, допустим, преодолеет 47f по координате "y" в 2д пространстве

144