我有一些旧的 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
图像正确显示。