我有一些旧的C ++ / MFC代码,它使用GDI在设备上下文(CDC
)中创建图像,使用Rectangle
之类的函数。然后由CPaintDC
的析构函数将图像绘制到屏幕上。一切都按预期工作。
现在我想将图像存储在PNG文件中。为此,我使用的是Windows Imaging Component(WIC)。我可以通过创建位图帧,将像素存储在缓冲区中,并使用WritePixels
将像素复制到其中来在WIC中创建图像。然后WIC通过Commit
将图像存储为PNG文件。这一切也有效。
问题是,如何将使用GDI创建的图像(CDC
)传输到WIC识别的内容?我正在寻找比存储到缓冲区后跟CDC::GetPixel
的{{1}}循环更高效的东西。
Windows 7,Visual Studio 2015,C ++。
更新:我正在尝试使用@Andrew Komiagin建议的CImage方法。我的代码是
WritePixels
这会生成一个PNG图像文件,其中包含全黑方形,w x h像素,而不是我绘制的图像。我知道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);
正在正确绘制图像(见下文)。
为了进行比较,对象({1}}中的RenderToDC
位于MyControl::OnPaint
中:
CStatic
图像显示正确。
答案 0 :(得分:2)
我建议使用来自ATL / MFC的标准 CImage 类,它与GDI设备上下文配合使用,本机支持在JPEG,GIF,BMP和便携式网络中加载和保存图像的功能图形(PNG)格式。
以下是如何使用它的示例:
def get_winner(grid):
'''returns 'X', 'O', or None'''
line_dxs = [
# rows
(0,1,2),
(3,4,5),
(6,7,8),
# cols
(0,3,6),
(1,4,7),
(2,5,8),
# diags
(0,4,8),
(2,4,6)
]
for dxs in line_dxs:
line = [grid[dx] for dx in dxs]
if line == ['X', 'X', 'X']:
return 'X'
elif line == ['O', 'O', 'O']:
return 'O'