Я рисую растровые изображения в Direct2D. Растровые изображения используют прозрачность (альфа-канал).Direct2D - Как сделать гамма-правильную прозрачность (альфа) с растровыми изображениями
Смешивание выглядит неправильно.
В качестве теста я загрузил чистое черно-белое изображение PNG с прозрачностью 50% и нарисовал его на белом фоне. Результат - пиксели с красным, зеленым и синим значением 127 (0x7F7F7F). Это предполагает, что смесь Direct2D игнорирует гамма и обрабатывает значения цвета, как если бы они были линейными.
(Растровые изображения используют обычное цветовое пространство sRGB и имеют 32 бита на пиксель, по 8 бит для красных, зеленых, синих и альфа). Они загружаются в формате GUID_WICPixelFormat32bppPBGRA.
В sRGB смесь между черным и белым составляет 186 (0xBABABA). Это идеальный результат, который я хочу.
Может ли Direct2D отображать прозрачность с учетом гаммы? Как мне это сделать? Любая помощь оценивается.
Я думаю, что у вас есть это в обратном направлении. В sRGB 50% будут выглядеть наполовину между черным и белым (по яркости, по-разному). Это выглядит слишком ярким или слишком темным? Это может быть связано с тем, как он отображается. –
Мое понимание - цветовое пространство sRGB определяет нелинейное преобразование между интенсивностью пикселей и фактическим сохраненным числом. т.е. гамма-кривой. Например, 8-битное значение цвета колеблется от 0 до 255, но из-за гамма-кривой значение 127 (на полпути) отображается при яркости около 20%. Таким образом, гамма-правильная 50% -ная смесь черного и белого должна иметь значение в пикселях 186 (полная шкала 73%). Так что в Direct2d моя смесь выглядит слишком темной. –
@astraycat, если вы просматриваете чередующиеся черно-белые пиксели и сравниваете их с твердым блоком, блок BABABA должен быть одинаковой яркости на правильно откалиброванном мониторе. Даже на некалиброванном мониторе BABABA должен быть ближе, чем 7F7F7F. –