2

GDI+ を使用して C++ CWnd ウィンドウに JPG を表示しています。JPG の背景は 0xffffff の真っ白ですが、graphics.DrawImage を使用して表示すると、背景はオフホワイトで、0xfff7f7、0xf7fff7、0xf7f7f7 などのピクセル カラーが混在しています。以下はコードです。CompositingMode、SmoothingMode などのさまざまな設定を試しました。画像はスケーリングされません。

奇妙なことに、画像内の他の白以外のコンテンツによって背景色が異なります。単純なすべて白の JPG を作成すると、それは機能します。または、黒のテキストだけを含むほぼ白の JPG でも機能します。画像の比較を以下に示します。


  CClientDC dc(this);
  Gdiplus::Graphics graphics(dc);

  Gdiplus::Bitmap* bmp = Gdiplus::Bitmap::FromFile( L"c:\\test.jpg" );
  graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQuality); 
  //graphics.SetCompositingQuality(Gdiplus::CompositingQualityHighQuality); 
  graphics.SetCompositingQuality(Gdiplus::CompositingQualityDefault); 
  graphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy); 
  //graphics.SetSmoothingMode( Gdiplus::SmoothingMode::SmoothingModeDefault );
  graphics.DrawImage(bmp, 0, 0, bmp->GetWidth(), bmp->GetHeight() );

ここでは、画像の左側にのみテキストといくつかのブレンディングがあります (アルファなし、これは JPG) 。右側はすべて真っ白です。背景がすべて灰色になっていることがわかります。

代替テキスト

ここで、内部コンテンツの削除を開始しました (左側のみ)。ある時点の後、背景全体が白く表示され始めます。???

代替テキスト

画像領域の大部分を削除する限り、白が表示される前に画像領域のどの部分を削除しても問題ありません。png についても同様です。

これが元のtest.jpg画像です...

代替テキスト

4

2 に答える 2

4

私は見つけた解決策で私の質問に答えています。私の場合、渡されたHDCでgraphics.DrawImageを直接使用すると、いくつかの問題が発生するようです。最初の描画にメモリDCを使用し、次にHDCでBitBltを使用すると、動作します。

PNGと透明度にも問題がありました。以下の解決策を使用して、私もこの問題を解決することができました。私のPNGは、Bitmap::FromStreamを使用してストリームからロードされました。アルファチャネルが失われ、LockBitsを使用してさまざまな試みを試み、PixelFormat32bppARGBを使用してビットマップを再作成し、クローンを作成しました。私は(多くの努力と余分なコードの後で)何かを機能させることができましたが、それでも私がここで尋ねた灰色の背景の問題がありました。

私の場合、透明な領域の背景色は既知です。Bitmap.GetHBITMAPを使用して、背景色を渡しました。次に、ビットマップが最初にメモリDCに描画されました。ここで私は私の両方の問題を解決することができました!


  Gdiplus::Bitmap* bmp = Gdiplus::Bitmap::FromFile( L"c:\test.jpg" )
  Gdiplus::Color backColor( 0xff, 0xff, 0xff );
  HBITMAP hBmp;
  bmp->GetHBITMAP( backColor, &hBmp );
  CDC     bitmapDC;
  bitmapDC.CreateCompatibleDC(hdc);  // pass original HDC for drawing
  HBITMAP oldBmp = bitmapDC.SelectBitmap(hBitmap);
  ::BitBlt( hdc, x, y, cx, cy, bitmapDC.m_hDC, 0, 0, SRCCOPY );
  bitmapDC.SelectBitmap(oldBmp);
  DeleteObject( hBmp );

誰かが知っているなら、なぜこれが問題を解決するのか興味があります。

于 2011-01-05T16:34:37.290 に答える
0

JPG の背景が真に白であることをどのように確認しましたか? JPG は、ピクセルの色を変えることができる圧縮を実装しています。混合色がある場合、その圧縮の一部である特定のタイプのブレンドと混合が存在する可能性があります。

元の画像を見せてもらえますか?

于 2011-01-04T17:13:43.373 に答える