Windows API TransparentBlt 函数详解

发布于 14 天前  33 次阅读


TransparentBlt函数用于进行从指定的原设备上下文到目标设备上下文图像位块的颜色传输
简言之,TransparentBlt函数主要用于从源图像中以位块的形式(一张位图可以被分为好几个不同颜色的位图块,可以理解为有颜色的小正方形色块组成的一张图片)传输图像到绘图窗口


函数常用功能

  1. 直接用于通过调用Windows GDI函数来在窗口中显示图片
  2. 用于位图的截图操作,由于这个函数将图像以位块的形式传输,所以我们可以通过只传输部分位块以达到截取部分图片的操作
  3. 用于实现透明色,由于这个函数将图像以为快的形式传输,所以我们可以通过只传输部分位块以达到实现透明效果,例如把不需要的部分全部调成一个图片中没有出现过的颜色(很重要,否则会造成图像缺失),然后设置若位块的颜色与之相符,色不传输,就达到了视线透明色的效果了

函数语法

BOOL TransparentBlt(
  _In_ HDC  hdcDest,
  _In_ int  xoriginDest,
  _In_ int  yoriginDest,
  _In_ int  wDest,
  _In_ int  hDest,
  _In_ HDC  hdcSrc,
  _In_ int  xoriginSrc,
  _In_ int  yoriginSrc,
  _In_ int  wSrc,
  _In_ int  hSrc,
  _In_ UINT crTransparent
);

函数参数

hdcDest

目标设备上下文句柄

xoriginDest

目标对象所在矩形的左上角的x坐标(即图片左上角顶点的x坐标)

yoriginDest

目标对象所在矩形的左上角的y坐标(即图片左上角顶点的y坐标)

wDest

目标对象所在矩形的宽度

hDest

目标对象所在矩形的高度

hdcSrc

源设备上下文句柄

xoriginSrc

源对象所在矩形的左上角的x坐标(即从图片的哪个位置开始传输位块)

yoriginSrc

源对象所在矩形的左上角y坐标(即从图片的那个位置开始传输位块)

wSrc

源对象所在矩形的宽度

hSrc [in]

源对象所在矩形的高度

crTransparent [in]

源位图中的透明色 0x16进制的透明色
Eg: 0x000000

函数的返回值

如果该函数成功执行,则返回值为TRUE.

如果该函数执行失败,则返回值为FALSE.

函数的注意事项

  1. TransparentBlt函数兼容的格式:bitmaps位图(DDBs)
  2. TransparentBlt函数支持源位图的所有格式,但是对于32位的位图只复制alpha值。使用AlphaBlend函数来指定32位的位图中每个像素的透明度
  3. 如果源位图和目标位图的举行大小不相同,那么将会将源位图拉伸以匹配目标矩形的大小
  4. 当使用 SetStretchBltMode 函数的时候,BLACKONWHITE 和 WHITEONBLACK 的 IStretchMode 模式将会在 TransparentBLT 函数中转换为 COLORONCOLOR 模式
  5. 目标设备上下文指定目标坐标的转换类型,源设备上下文指定源坐标的转换类型
  6. 如果源或目标位图的宽度或高度为负,则 TransparentBlt 不会镜像(英文文档中用的是mirror)位图
  7. 在多显示器的系统中使用该函数时,hdcSrc 和 hdcDest 必须引用同一设备,否则该函数将失效,要在 DCs 之间传输不同设备的数据,请通过调用 GetDIBits 将内存位图转换为 DIB 。要将 DIB 显示到第二个设备请调用 SetDIBits 或StretchDIBits

函数使用环境要求

最低客户端版本:Windows 2000 Professional(仅桌面应用)
最低服务器版本:Windows 2000 Server(仅桌面应用)
引用的头文件:WinGdi.h和Windows.h
引用的库文件:Msimg32.lib
引用的DLL文件:Msimg32.dll

使用示例

#include <graphics.h>//引用EasyX库来做此次示范 
#include <conio.h>//EasyX库支持文件
#include <Windows.h> 
#pragma comment( lib, "MSIMG32.LIB")
// 引用该库才能使用 TransparentBlt 函数
int main()
{
    // 创建绘图窗口
    initgraph(640, 480);
    // 定义 IMAGE 对象,并加载 c:\test.bmp 图片
    // 要求:该图片大小 80 x 80,用白色表示透明部分
    IMAGE img;
    loadimage(&img, "c:\\test.bmp");
    // 获取绘图窗口和 IMAGE 对象的句柄,TransparentBlt 函数需要用
    HDC dstDC = GetImageHDC();
    HDC srcDC = GetImageHDC(&img);
    // 使用 Windows GDI 函数实现透明位图
    TransparentBlt(dstDC, 0, 0, 80, 80, srcDC, 0, 0, 80, 80, 0xffffff); // 最后一个参数是表示透明色为白色
    // 使 GDI 操作生效
    FlushBatchDraw();
    // 按任意键退出
    getch();
    return 0;
}

Hope to be a free geek forever.