将图像从CDC传输到Windows Imaging Component(WIC)?

时间:2015-10-16 20:10:45

标签: mfc gdi wic

我有一些旧的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

图像显示正确。

1 个答案:

答案 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'