2

我有一些旧的 C++/MFC 代码,它们使用 GDI 在设备上下文 () 中创建图像CDC,使用Rectangle. 然后图像被 . 的析构函数绘制到屏幕上CPaintDC。一切都按预期工作。

现在我想将图像存储在 PNG 文件中。为此,我正在使用 Windows 映像组件 (WIC)。我可以通过创建位图框架、将像素存储在缓冲区中并使用WritePixels. 然后 WIC 将图像存储为 PNG 文件,通过Commit. 这一切也有效。

问题是,如何将我使用 GDI 创建的图像(位于 aCDC中)传输到 WIC 识别的东西上?我正在寻找比CDC::GetPixel循环存储到缓冲区中更有效的东西,然后是WritePixels.

Windows 7、Visual Studio 2015、C++。

更新:我正在尝试获取@Andrew Komiagin 建议的 CImage 方法。我的代码是

CDC memdc;
memdc.CreateCompatibleDC(nullptr);
myControl.RenderToDC(memdc); // this draws the image onto the dc
CBitmap bmp;
BOOL ok=bmp.CreateCompatibleBitmap(&memdc, w, h); // w=h=292 defined elsewhere
CBitmap *pOldBitmap=memdc.SelectObject(&bmp);
ok=memdc.BitBlt(0, 0, w, h, &memdc, 0, 0, SRCCOPY);
CImage tempImageObj;
tempImageObj.Attach((HBITMAP)bmp.Detach());
CString outputFilename("outputImage.png");
HRESULT hr=tempImageObj.Save(outputFilename);

这会生成一个带有全黑正方形、wxh 像素的 PNG 图像文件,而不是我绘制的图像。我知道图像正在正确绘制RenderToDC(见下文)。

为了比较,这是MyControl::OnPaint用于控制(源自CStatic):

CPaintDC dc(this); // device context for painting
RenderToDC(dc); // this draws the image onto the dc
// Painted to screen by CPaintDC's destructor

图像正确显示。

4

1 回答 1

2

我建议使用来自 ATL/MFC 的标准CImage类,它与 GDI 设备上下文配合得很好,并且本机支持以 JPEG、GIF、BMP 和可移植网络图形 (PNG) 格式加载和保存图像的能力。

下面是一个关于如何使用它的例子:

CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap Bmp;
Bmp.CreateCompatibleBitmap(&dc,ClientRect.Width(),ClientRect.Height());
MemDC.SelectObject(&Bmp);
MemDC.BitBlt(0,0,ClientRect.Width(),ClientRect.Height(),&dc,0,0,SRCCOPY);
CImage TempImageObj;
TempImageObj.Attach((HBITMAP)Bmp.Detach());
TempImageObj.Save(sFilePath);
于 2015-10-16T20:30:51.340 回答