我正在用C ++,GDI进行编码
我使用stretchDIBits将图像绘制到dc。

        ::SetStretchBltMode(hDC, HALFTONE);
        ::StretchDIBits(
            hDC,
            des.left,des.top,des.right - des.left,des.bottom - des.top,
            0, 0,
            img.getWidth(),
            img.getHeight(),
            (img.accessPixels()),
            (img.getInfo()),
            DIB_RGB_COLORS,
            SRCCOPY
            );


但是,它很慢。
所以我改为使用DrawDib函数。

::SetStretchBltMode(hDC, HALFTONE);
DrawDibDraw(
                        hdd,
                        hDC,
                        des.left,des.top,des.right - des.left,des.bottom - des.top,
                        (LPBITMAPINFOHEADER)(img.getInfo()),
                        (img.accessPixels()),
                        0, 0,
                        img.getWidth(),
                        img.getHeight(),
                        DDF_HALFTONE
                        );


但是结果就像通过COLORONCOLOR模式绘制一样。
如何改善绘图质量?

最佳答案

那么DrawDibDraw已过时。

您是否考虑过尝试加速StretchDIBits?一个很好的答案here

您当然可以完全不使用StretchDIBits。

如果您最初通过

hBitmap = LoadImage( NULL, _T( "c:\\Path\File.bmp" ), IMAGE_BITMAP, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_LOADFROMFILE );

SIZE size;
BITMAP bmp;
GetObject( (HGDIOBJ)hBitmap, sizeof( BITMAP ), &bmp );
size.cx = bmp.bmWidth;
size.cy = bmp.bmHeight;


然后,您可以按以下方式渲染位图。

HDC hBitmapDC   = CreateCompatibleDC( hDC );

HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

SetStretchBltMode( hDc, HALFTONE );

StretchBlt( hDC, rcItem.left,rcItem.top, rcItem.right,rcItem.bottom, hBitmapDC, 0, 0, size.cx, size.cy, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );


当然,需要记住的一点是,您实际上不需要在每次blt时都创建兼容的DC,这将大大加快速度。只需创建兼容的DC并在加载图像时选择位图对象即可。然后握住它,直到需要为止。关闭时,只需删除DeleteObject,如上所示。

09-11 19:29