防止GDI + PNG编码器将Gamma信息添加到1位PNG

时间:2010-10-19 10:40:43

标签: windows gdi+ png imaging encoder

我想知道是否可以指示成像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,GAMA,CHRM

我实际上只是期待PLTE而不是sRGB。如何设置编码器以跳过伽玛和色度计算?

2 个答案:

答案 0 :(得分:0)

我也有兴趣知道是否有可能。我在c ++程序中使用gdi +为网站生成png,而png的颜色与css不同,尽管我输入了完全相同的值。通过删除sRGB内容,可以解决大多数浏览器中的gamma问题。

我希望有一个解决方案!

答案 1 :(得分:0)

我通过实现FreeImage库(http://freeimage.sourceforge.net/)解决了这个问题。

我使用GDI +创建位图,我锁定其pixeldata,创建一个freeimage位图,也将其锁定并复制像素。

然后我将freeimage保存到PNG并瞧...正确的伽玛信息,在每个浏览器中都很好。

这是一个更多的开销(虽然我有一种感觉,FreeImage比GDI +更快地保存图像,使整个过程更快)。但是,当然,您需要在项目中使用带有dll的额外库。