2

Imaging PNG Encoder に、ガンマお​​よびクロマ情報を 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

私は実際にはsRGBではなくPLTEだけを期待していました。ガンマとクロマの計算をスキップするには、エンコーダをどのようにセットアップすればよいですか?

4

2 に答える 2

0

私はFreeImageライブラリ(http://freeimage.sourceforge.net/)を実装することでこれを解決しました。

GDI +を使用してビットマップを作成し、そのピクセルデータをロックし、フリーイメージビットマップを作成し、それもロックして、ピクセルをコピーします。

次に、freeimageにそれをPNGに保存させ、出来上がり...すべてのブラウザで適切なガンマ情報を修正します。

オーバーヘッドが少し増えます(ただし、FreeImageはGDI +よりもはるかに高速に画像を保存し、全体的なプロセスをさらに高速化するように感じます)。ただし、もちろん、プロジェクトにはdllを含む追加のライブラリが必要です。

于 2010-11-19T16:07:40.757 に答える
0

それが可能かどうかも知りたいです。私は c++ プログラムで gdi+ を使用して、Web サイト用の png を生成します。まったく同じ値を入力しても、png の色は css とは異なります。sRGB を削除することで、ほとんどのブラウザーでガンマの問題を解決できます。

これに対する解決策があることを願っています!

于 2010-11-16T22:07:02.353 に答える