具有白色背景的JPG的GDI + DrawImage不是白色的

时间:2011-01-04 17:09:13

标签: gdi+ drawimage

我正在使用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)。右边的一切都是纯白色的。你可以看到背景都是灰色的。

alt text

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

alt text

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

这是原始的test.jpg图片......

alt text

2 个答案:

答案 0 :(得分:3)

我正在用我找到的解决方案回答我的问题。似乎直接在传递的HDC上使用graphics.DrawImage在我的情况下有一些问题。如果我使用内存DC进行初始绘图,那么BitBlt就可以在HDC上运行了。

我在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 );

如果有人知道,我会感兴趣为什么这可以解决问题。

答案 1 :(得分:0)

你是如何确认JPG背景真的是白色的? JPG实现可以改变像素颜色的压缩。如果存在混合颜色,则可以存在某些类型的混合和混合,这是压缩的一部分。

你能告诉我们原始图片吗?