最近,我在SO中问了一个有关正确缩放位图的问题,以便它可以保持图片质量:
我尝试使用注释中的建议来使用`StretchBlt,因此我制作了一个小型演示程序。
在将拉伸模式设置为后,它确实提高了位图的清晰度BLACKONWHITE
。
我想尝试使用某些颜色(例如黑色)使位图的一部分透明。
我以前使用过TransparentBlt,但现在不知道该怎么做。
为了保持图像的清晰度,我需要StretchBlt
在内存DC中使用它,拉伸模式为BLACKONWHITE
。
问题是我不知道如何Blt
透明地将其插入主窗口的DC。
这是演示应用程序中的代码片段:
case WM_PAINT:
{
// main window's DC
hdc = BeginPaint(hWnd, &ps);
// main window's client rectangle
RECT r;
GetClientRect( hWnd, &r );
// memory DC for double buffering
HDC MemDC = CreateCompatibleDC( hdc );
// fill it with test brush
FillRect( MemDC, &r, (HBRUSH)GetStockObject( GRAY_BRUSH ) );
// select loaded bitmap into memory DC
HBITMAP old = (HBITMAP)SelectObject( MemDC, bmp );
// get bitmaps dimensions
BITMAP b;
GetObject( bmp, sizeof(BITMAP), &b );
// needed to preserve bitmap's sharpness
SetStretchBltMode( hdc, BLACKONWHITE );
StretchBlt( hdc, 0, 0, r.right - r.left, r.bottom - r.top,
MemDC, 0, 0, b.bmWidth, b.bmHeight, SRCCOPY );
/* TransparentBlt( ... ); call should go here,
so I can make portion of the bitmap transparent,
in order for the gray brush can be seen */
// cleanup
SelectObject( MemDC, old );
DeleteDC(MemDC);
EndPaint(hWnd, &ps);
}
return 0L;
break;
如何修改上面的代码,以便位图可以透明,以便可以看到测试笔刷?
原始图像如下。
我只需要使用TransparentBlt( ..., RGB( 0, 0, 0 ) );
使其在黑色区域透明即可。
显示结果的示例图片:
通过Internet浏览,我只找到了有关双重缓冲的简单教程。
我还没有找到类似的东西,但是老实说,我对WIN32 API经验不足,所以我不知道如何正确地表达问题,以便获得更好的搜索结果。
如果需要更多信息,请索取,我会提供。
为了使问题简短,将其省略。
您需要使用特定的栅格操作来创建遮罩,以仅复制定义了遮罩的像素。http://www.winprog.org/tutorial/transparency.html
下一个代码是MFC,但是您可以轻松地将MFC对象提取并将其转换为Standard GDI操作。http://www.codeproject.com/Articles/703/Drawing-Transparent-Bitmap-with-ease-with-on-the-f
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句