最近,我在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;
Run Code Online (Sandbox Code Playgroud)
如何修改上面的代码,这样一个位图可以透明,以便可以看到测试刷?
原始图像是下面的.

我只需要使用TransparentBlt( ..., RGB( 0, 0, 0 ) );它在黑色区域透明.
显示结果的示例图片:

通过互联网浏览,我发现只有关于双缓冲的简单教程.
我还没有找到这样的东西,但说实话,我对WIN32 API缺乏经验,所以我不知道如何正确地表达问题,以获得更好的搜索结果.
如果需要进一步的信息,请求它,我会提供.
为了使问题简短,省略了它.
您需要使用特定的光栅操作创建蒙版,以仅复制定义了蒙版的像素。 http://www.winprog.org/tutorial/transparency.html
下一个代码是MFC,但是您可以轻松提取MFC 对象并将其转换为标准GDI 操作。 http://www.codeproject.com/Articles/703/Drawing-Transparent-Bitmap-with-ease-with-on-the-f