我有一些老的C++/MFC代码,它使用GDI在设备上下文(CDC)中使用Rectangle之类的函数创建映像。然后由CPaintDC的析构函数将图像绘制到屏幕上。一切都如期而至。
现在,我想将图像存储在PNG文件中。为此,我使用Windows图像组件(WIC)。我可以通过创建位图帧、在缓冲区中存储像素并使用WritePixels将像素复制到图像中,从而在WIC中创建图像。然后,WIC通过Commit将图像存储为PNG文件。所有这一切也有效。
问题是,如何将我使用CDC中的GDI创建的映像传输到WIC识别的东西上?我正在寻找比将CDC::GetPixel循环存储到缓冲区中的WritePixels更有效的东西。
Windows 7,Visual 2015,C++。
更新:我正在尝试获得@Andrew建议的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);这会产生一个PNG图像文件,它有一个全黑方格,w像素,而不是我画的图像。我知道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图像显示正确。
发布于 2015-10-16 20:30:51
我建议使用来自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);https://stackoverflow.com/questions/33178787
复制相似问题