Запретить GDI+ PNG Encoder добавлять гамма-информацию в 1-битный PNG
Интересно, можно ли поручить кодировщику изображений PNG не добавлять информацию о гамме и цветности в 1-битный PNG.
Я создаю 2 цветовой палитры для изображения
ColorPalette* pal = (ColorPalette*)CoTaskMemAlloc(sizeof(ColorPalette) + 2 * sizeof(ARGB));
pal->Count = 2;
pal->Flags = 0;
pal->Entries[0] = MAKEARGB(0,0,0,0);
pal->Entries[1] = MAKEARGB(0,255,255,255);
if (FAILED(res = sink->SetPalette(pal))) {
return res;
}
CoTaskMemFree(pal);
а потом просто
BitmapData bmData;
bmData.Height = bm.bmHeight;
bmData.Width = bm.bmWidth;
bmData.Scan0 = bm.bmBits;
bmData.PixelFormat = PixelFormat1bppIndexed;
UINT bitsPerLine = imageInfo.Width * bm.bmBitsPixel;
UINT bitAlignment = sizeof(LONG) * 8;
UINT bitStride = bitAlignment * (bitsPerLine / bitAlignment); // The image buffer is always padded to LONG boundaries
if ((bitsPerLine % bitAlignment) != 0) bitStride += bitAlignment; // Add a bit more for the leftover values
bmData.Stride = bitStride / 8;
if (FAILED(res = sink->PushPixelData(&rect, &bmData, TRUE))) {
return res;
}
Полученное изображение PNG имеет большой размер и содержит следующие бесполезные заголовки:
SRGB, Гама, CHRM
На самом деле я ожидал, что PLTE не sRGB. Как мне настроить кодировщик, чтобы пропустить вычисления гаммы и цветности?
2 ответа
Я решил эту проблему путем реализации библиотеки FreeImage (http://freeimage.sourceforge.net/).
Я создаю растровое изображение с помощью GDI+, блокирую его пиксельные данные, создаю растровое изображение произвольного изображения, также блокирую его и копирую пиксели.
Затем я делаю freeimage, сохраняю его в формате PNG и вуаля... исправляю информацию о гамме, которая хороша в любом браузере.
Это немного больше накладных расходов (хотя у меня есть ощущение, что FreeImage сохраняет изображения гораздо быстрее, чем GDI+, что делает общий процесс еще быстрее). Но, конечно, вам понадобится дополнительная библиотека с dll для вашего проекта.
Мне также интересно узнать, возможно ли это. Я использую gdi+ в программе на C++ для генерации png для веб-сайта, и png имеют разные цвета, чем css, хотя я ввожу те же самые значения. Удаление содержимого sRGB может решить проблему гаммы в большинстве браузеров.
Я надеюсь, что есть решение для этого!