我正在用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,如上所示。