2

我想知道是否可以指示成像 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。如何设置编码器以跳过伽玛和色度计算?

4

2 回答 2

0

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

我用 GDI+ 创建位图,锁定它的像素数据,创建一个自由图像位图,也锁定它并复制像素。

然后我让 freeimage 将其保存为 PNG 和瞧……正确的伽马信息,在每个浏览器中都很好。

它的开销有点多(尽管我感觉 FreeImage 保存图像的速度比 GDI+ 快得多,从而使整个过程更快)。但是,当然,您的项目需要一个带有 dll 的额外库。

于 2010-11-19T16:07:40.757 回答
0

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

我希望有一个解决方案!

于 2010-11-16T22:07:02.353 回答