2

我正在使用 GDI+ 在 C++ CWnd 窗口中显示 JPG。JPG 具有纯白色背景,0xffffff,但是当使用 graphics.DrawImage 显示时,背景是灰白色的,混合了像素颜色,例如 0xfff7f7、0xf7fff7、0xf7f7f7。下面是代码,我尝试了CompositingMode、SmoothingMode等各种设置,图片没有缩放。

奇怪的是,背景颜色会根据图像中的其他非白色内容而有所不同。如果我制作一个简单的全白 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() );

在这里,我仅在图像的左侧有文本和一些混合(没有 alphas,这是 JPG)。右边的一切都是纯白色的。你可以看到背景都是灰色的。

替代文字

在这里,我开始删除内部内容(仅在左侧)。在某个点之后,整个背景开始显示为白色。???

替代文字

在图像区域开始显示白色之前删除图像区域的哪一部分并不重要,只要我删除它的大部分即可。pngs也是如此。

这是原始 test.jpg 图像...

替代文字

4

2 回答 2

4

我正在用我找到的解决方案来回答我的问题。在我的情况下,直接在传递的 HDC 上使用 graphics.DrawImage 似乎有一些问题。如果我使用内存 DC 进行初始绘图,然后在 HDC 上对其进行 BitBlt,则它可以工作。

PNG和透明度也有一些问题。使用下面的解决方案,我也能够解决这个问题。我的 PNG 是使用 Bitmap::FromStream 从流中加载的。alpha 通道丢失了,我尝试使用 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 回答