Запретить GDI + PNG Encoder добавлять гамма-информацию в 1-битный PNG - PullRequest
2 голосов
/ 19 октября 2010

Интересно, можно ли поручить кодировщику изображений PNG не добавлять информацию о гамме и цветности в 1-битный PNG.

Я создаю двухцветную палитру для изображения

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, gAMA, cHRM

На самом деле я ожидал, что PLTE не sRGB.Как мне настроить кодировщик для пропуска расчетов гаммы и цветности?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2010

Я решил эту проблему, реализовав библиотеку FreeImage (http://freeimage.sourceforge.net/).

Я создаю растровое изображение с помощью GDI +, блокирую его пиксельные данные, создаю растровое изображение произвольного изображения, также блокирую его и копирую пиксели.

Затем я делаю freeimage, сохраняю его в формате PNG и вуаля ... корректная информация о гамме, хорошая в любом браузере.

Это немного больше накладных расходов (хотя у меня есть ощущение, что FreeImage сохраняет изображения намного быстрее, чем GDI +, что делает общий процесс еще быстрее). Но, конечно, вам понадобится дополнительная библиотека с dll для вашего проекта.

0 голосов
/ 17 ноября 2010

Мне также интересно узнать, возможно ли это.Я использую gdi + в программе на c ++ для генерации png для веб-сайта, и png имеют разные цвета, чем css, хотя я ввожу те же самые значения.Удалив sRGB, это может решить проблему гаммы в большинстве браузеров.

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

...