我正在使用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图片......
答案 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实现可以改变像素颜色的压缩。如果存在混合颜色,则可以存在某些类型的混合和混合,这是压缩的一部分。
你能告诉我们原始图片吗?