Изменяются ли данные png rgba браузером при отображении?

У меня есть 2-пиксельное изображение PNG со следующим rgba:

image.setAt(0, 0, { red:255, green:10, blue:10, alpha:100 });
image.setAt(1, 0, { red:255, green:255, blue:55, alpha:255 });
image.setAt(0, 1, { red:90, green:10, blue:65, alpha:250 });
image.setAt(1, 1, { red:60, green:255, blue:0, alpha:14 });

(с использованием модуля node pngjs-image)

Когда изображение загружается браузером (firefox) и копируется на холст для проверки данных rgba, возвращается следующее:

255 7 7 100 
255 255 55 255 
89 9 64 250 
54 255 0 14 

Похоже, что сохраняются только значения альфа-канала, а цвета пикселей изменяются произвольно.

Что происходит?

(с использованием Firefox 41 в Linux)

ИЗМЕНИТЬ

Из вступления к модулю nodejs pngtoy я обнаружил следующее:

Низкоуровневая реализация парсера / чтения / декодера файлов PNG с использованием JavaScript в зависимости от размера клиента.

Почему это так, если браузеры уже поддерживают PNG?

Браузер просто загрузит и преобразует любой тип PNG в растровые изображения RGBA. Он также применит ICC и гамма-коррекцию к изображению, что приведет к другим значениям, чем в исходном растровом изображении.

Однако я подумал, что в самом PNG должны быть блоки коррекции ICC и Gamma, чтобы браузер применил их. Производит ли браузер такие манипуляции с изображениями для любого файла png даже без фрагмента ICC / gamma внутри файла?


person rlib    schedule 25.10.2015    source источник
comment
Поведение Firefox зависит от параметра gfx.color_manangement.mode в about: config (по умолчанию 2, попробуйте сбросить его до 0 и посмотрите, что произойдет), а также от того, содержит ли ваше изображение 2x2 информацию об управлении цветом (gAMA, sRGB, cHRM и / или фрагменты iCCP). Было бы полезно, если вы разместите копию самого файла PNG.   -  person Glenn Randers-Pehrson    schedule 25.10.2015
comment
Необработанную дату поставлю позже. Играл с gfx безуспешно. Никаких дополнительных данных в PNG нет: внутри только чанки IHDR, IDAT и IEND.   -  person rlib    schedule 25.10.2015
comment
ОК удалил color_management. Осталось возможное преобразование в предварительно умноженную альфа и обратно. Что произойдет, если у вас есть цветной пиксель с альфа == 0?   -  person Glenn Randers-Pehrson    schedule 25.10.2015
comment
Если альфа равна 0, то для цветного пикселя устанавливается значение 0,0,0 ...   -  person rlib    schedule 25.10.2015


Ответы (1)


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

Обратите внимание, что этого не происходит, когда вы щелкаете изображение PNG и «сохраняете как ...»; в этом случае возвращается исходный PNG.

Firefox также может изменять внутреннее изображение (в зависимости от настройки gfs.color_management.mode в "about: config"), когда присутствуют блоки управления цветом (iCCP, sRGB, gAMA и / или cHRM), но это не похоже на иметь дело с этим конкретным вопросом. Опять же, «сохранить как ...» вернет исходные пиксели и блоки управления цветом без изменений.

person Glenn Randers-Pehrson    schedule 25.10.2015