我想知道是否可以指示成像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。如何设置编码器以跳过伽玛和色度计算?
答案 0 :(得分:0)
我也有兴趣知道是否有可能。我在c ++程序中使用gdi +为网站生成png,而png的颜色与css不同,尽管我输入了完全相同的值。通过删除sRGB内容,可以解决大多数浏览器中的gamma问题。
我希望有一个解决方案!
答案 1 :(得分:0)
我通过实现FreeImage库(http://freeimage.sourceforge.net/)解决了这个问题。
我使用GDI +创建位图,我锁定其pixeldata,创建一个freeimage位图,也将其锁定并复制像素。
然后我将freeimage保存到PNG并瞧...正确的伽玛信息,在每个浏览器中都很好。
这是一个更多的开销(虽然我有一种感觉,FreeImage比GDI +更快地保存图像,使整个过程更快)。但是,当然,您需要在项目中使用带有dll的额外库。