Запретить 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 может решить проблему гаммы в большинстве браузеров.

Я надеюсь, что есть решение для этого!

Другие вопросы по тегам