公众号封面图_图片抠图用什么软件_在线人物抠图_在线修图软件_凡客制图
当前位置:建站首页 > 新闻资讯 > 公司新闻 >

全透明位图文件的显示信息(TransparentBlt涵数)

发表日期:2021-04-07 05:27文章编辑:jianzhan浏览次数: 标签:    

transparentblt

包括全透明色的位图文件的绘图方式有多种多样,非常简单的方式是启用现有的涵数:transparentblt,还可以根据自身的编码完成相近TransparentBlt的作用,完成全过程也是有二种方式,一种是事前做一张掩码位图文件,另外一种是动态性转化成掩码位图文件。文中将详细介绍动态性转化成掩码位图文件绘图具备全透明地区位图文件的方式。

一、TransparentBlt 涵数的应用 

TransparentBlt 涵数在windows98/Windows2000之上版本号运作,系统软件中必须包括 Msimg32.dll,应用时能够连接 Msimg32.lib。

Windows98下的TransparentBlt会造成資源泄露,因此不提议在win98下应用该涵数。

TransparentBlt涵数原形以下:

BOOL TransparentBlt(
HDC hdcDest, // 总体目标DC
int nXOriginDest, // 总体目标X偏位
int nYOriginDest, // 总体目标Y偏位
int nWidthDest, // 总体目标总宽
int hHeightDest, // 总体目标高宽比
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起始点
int nYOriginSrc, // 源Y起始点
int nWidthSrc, // 源总宽
int nHeightSrc, // 源高宽比
UINT crTransparent // 全透明色,colorref种类
);

应用实例:

CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);
CDC ImageDC;
patibledc(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject( FootballBMP);
TransparentBlt(pDC- m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));
ImageDC.SelectObject(pOldImageBMP);

二、完成TransparentBlt涵数

以便了解具备全透明色位图文件的绘图全过程,大家来亲手创建一个具备同TransparentBlt作用一致的试验涵数,称作TransparentBlt2。

试验素材图片:有二张位图文件:bk.bmp是情况位图文件,football.bmp包括全透明地区,全透明色为深蓝色RGB(0,0,0xff)

试验目地:以bk.bmp为情况,将football.bmp绘图到情况中,产生以下的最后实际效果图

2.1 全透明位图文件绘图基本原理

假定football.bmp - 加载 HBITMAP hImageBMP - 选入 HDC hImageDC

2.1.1 转化成足球的纯色掩码位图文件,全透明地区为乳白色(全1),非全透明地区为灰黑色(全0)

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建纯色位图文件
SetBkColor(hImageDC, RGB(0,0,0xff)); // 设定情况色为深蓝色
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 复制到hMaskDC

那样足球位图文件中深蓝色地区在掩码位图文件中变成乳白色,其他地区为灰黑色,这时hMaskBMP 以下图:

(图一)

2.1.2 设定情况色为灰黑色,市场前景色为乳白色,将掩码位图文件(图一)与足球位图文件相"与"

SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

那样,掩码位图文件中情况色(灰黑色)的地区在hImageBMP中被保存,市场前景色(乳白色)的一部分变成灰黑色。 这时hImageBMP 以下图:

(图二)

2.1.3 设定情况色为乳白色,市场前景色为灰黑色,将掩码位图文件(图一)与情况开展“与”计算

SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

掩码中乳白色地区(数据信息与1相“与”結果不会改变)使情况维持不会改变,灰黑色地区变为灰黑色,这时情况显示信息以下:

(图三)

2.1.4 将hImageBMP(图二)与情况(图三)开展“或”计算

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPaiNT);

那样就将足球绘图到情况到了。

2.2 TransparentBlt2涵数所有完成编码

复制代码

void TransparentBlt2( HDC hdcDest, // 总体目标DC

int nXOriginDest, // 总体目标X偏位

int nYOriginDest, // 总体目标Y偏位

int nWidthDest, // 总体目标总宽

int nHeightDest, // 总体目标高宽比

HDC hdcSrc, // 源DC

int nXOriginSrc, // 源X起始点

int nYOriginSrc, // 源Y起始点

int nWidthSrc, // 源总宽

int nHeightSrc, // 源高宽比

UINT crTransparent // 全透明色,COLORREF种类

)

{

HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 建立适配位图文件

HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立纯色掩码位图文件

HDC hImageDC = CreateCompatibleDC(hdcDest);

HDC hMaskDC = CreateCompatibleDC(hdcDest);

hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);

hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图文件复制到临时性DC中

if (nWidthDest == nWidthSrc nHeightDest == nHeightSrc)

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);

else

StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,

hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设定全透明色

SetBkColor(hImageDC, crTransparent);

// 转化成全透明地区为乳白色,其他地区为灰黑色的掩码位图文件

BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 转化成全透明地区为灰黑色,其他地区维持不会改变的位图文件

SetBkColor(hImageDC, RGB(0,0,0));

SetTextColor(hImageDC, RGB(255,255,255));

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 全透明一部分维持显示屏不会改变,其他一部分变为灰黑色

SetBkColor(hdcDest,RGB(255,255,255));

SetTextColor(hdcDest,RGB(0,0,0));

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"计算,转化成最后实际效果

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

// 清除、修复

SelectObject(hImageDC, hOldImageBMP);

DeleteDC(hImageDC);

SelectObject(hMaskDC, hOldMaskBMP);

DeleteDC(hMaskDC);

DeleteObject(hImageBMP);

DeleteObject(hMaskBMP);

}

复制代码

2.3 TransparentBlt的此外一个版本号:TransparentBltU

TransparentBltU是Christian Graus 在WinDEV发布的一个涵数,作用与TransparentBlt一致,下列是所有完成编码:

复制代码

bool TransparentBltU(

HDC dcDest, // handle to Dest DC

int nXOriginDest, // x-coord of destination upper-left corner

int nYOriginDest, // y-coord of destination upper-left corner

int nWidthDest, // width of destination rectangle

int nHeightDest, // height of destination rectangle

HDC dcSrc, // handle to source DC

int nXOriginSrc, // x-coord of source upper-left corner

int nYOriginSrc, // y-coord of source upper-left corner

int nWidthSrc, // width of source rectangle

int nHeightSrc, // height of source rectangle

UINT crTransparent // color to make transparent

)

{

if (nWidthDest 1) return false;

if (nWidthSrc 1) return false;

if (nHeightDest 1) return false;

if (nHeightSrc 1) return false;

HDC dc = CreateCompatibleDC(NULL);

HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,

BITSPIXEL), NULL);

if (bitmap == NULL)

{

DeleteDC(dc);

return false;

}

HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);

if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,

nYOriginSrc, SRCCOPY))

{

SelectObject(dc, oldBitmap);

DeleteObject(bitmap);

DeleteDC(dc);

return false;

}

HDC maskDC = CreateCompatibleDC(NULL);

HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);

if (maskBitmap == NULL)

{

SelectObject(dc, oldBitmap);

DeleteObject(bitmap);

DeleteDC(dc);

DeleteDC(maskDC);

return false;

}

HBITMAP oldMask = (HBITMAP)SelectObject(maskDC, maskBitmap);

SetBkColor(maskDC, RGB(0,0,0));

SetTextColor(maskDC, RGB(255,255,255));

if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))

{

SelectObject(maskDC, oldMask);

DeleteObject(maskBitmap);

DeleteDC(maskDC);

SelectObject(dc, oldBitmap);

DeleteObject(bitmap);

DeleteDC(dc);

return false;

}

SetBkColor(dc, crTransparent);

BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);

SetBkColor(dc, RGB(0,0,0));

SetTextColor(dc, RGB(255,255,255));

BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);

HDC newMaskDC = CreateCompatibleDC(NULL);

HBITMAP newMask;

newMask = CreateBitmap(nWidthDest, nHeightDest, 1,

GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

if (newMask == NULL)

{

SelectObject(dc, oldBitmap);

DeleteDC(dc);

SelectObject(maskDC, oldMask);

DeleteDC(maskDC);

DeleteDC(newMaskDC);

DeleteObject(bitmap);

DeleteObject(maskBitmap);

return false;

}

SetStretchBltMode(newMaskDC, COLORONCOLOR);

HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);

StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,

nWidthSrc, nHeightSrc, SRCCOPY);

SelectObject(maskDC, oldMask);

DeleteDC(maskDC);

DeleteObject(maskBitmap);

HDC newImageDC = CreateCompatibleDC(NULL);

HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,

GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

if (newImage == NULL)

{

SelectObject(dc, oldBitmap);

DeleteDC(dc);

DeleteDC(newMaskDC);

DeleteObject(bitmap);

return false;

}

HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);

StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,

nHeightSrc, SRCCOPY);

SelectObject(dc, oldBitmap);

DeleteDC(dc);

DeleteObject(bitmap);

BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,

newMaskDC, 0, 0, SRCAND);

BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,

newImageDC, 0, 0, SRCPAINT);

SelectObject(newImageDC, oldNewImage);

DeleteDC(newImageDC);

SelectObject(newMaskDC, oldNewMask);

DeleteDC(newMaskDC);

DeleteObject(newImage);

DeleteObject(newMask);

return true;

}

复制代码

表明:文中出示的TransparentBlt2涵数致力于表明全透明位图文件的显示信息基本原理,在Windows2000之上自然环境具体应用中建八局议应用现有的TransparentBlt涵数来绘图全透明位图文件。

源码免费下载!

文中转自:syxchina/archive/2010/06/

有关阅读文章

今年哪个平稳币能赢?TUSD协同创办人:有充足流动性性和透

不久以往的2018,平稳币变成区块链链制造行业的一大受欢迎议案,组织项目投资者早已刚开始观念到平稳币的发展潜力,各种新起平稳币五花八门。依据数据加密研

Oracle TDE全透明数据加密科学研究及其检测

Oracle TDE(Oracle Transparent Data Encryption)TDE全透明数据信息数据加密容许客户对每个表列或全部表室内空间开展数据加密。当客户向数据加密的列中

怎样设定全透明色RGB值

全透明水平的token以下 !--全透明度百分数 : 八位色调值前俩位-- !--100% : FF-- !--95% : F2-- !--90% : E6--

ppt照片如何改动全透明度

大家在加上照片情况下,能够给照片设定不一样特性,例如设定适合的全透明度来相互配合情况,提升观赏性,实际如何设定呢,下边网编以Office2010为例子,给

【Unity Shader】(五) ------ 全透明实际效果之半全透明实际效果的实

小编应用的是 Unity 2018.2.0f2 + VS2017,提议阅读者应用与 Unity 2018 相仿的版本号,防止一些由于版本号不一致而出現的难题。 【Unity S

返回列表
相关新闻

.mx网站域名申请注册,西班牙网站域名申请注册

全世界一切企业、团队和本人都可申请注册西班牙.mx网站域名。挂证服务:NA申请注册期限:1-五...

日期:2021-03-31 浏览次数:154

你了解CSO对云安全性的较大忧虑是啥吗?

依据Bitglass对1000多位IT和IT安全性从事工作人员的调研显示信息,她们公账共云安全性的较大忧...

日期:2021-03-02 浏览次数:106

百度搜索检索顾客端设计方案共享:全新升级的视

二零一一年十月8日,百度搜索检索手机上顾客摆正式登录Apple Store。二零一一年11月12日,百度...

日期:2021-03-01 浏览次数:133

宣传策划宣传海报线上完全免费制作的流程

宣传策划宣传海报在各种各样当场以及平时生活起居充足充分发挥了十分大的作用,不仅能够...

日期:2021-01-29 浏览次数:159

完全免费照片制做手机软件应用起来便捷又省钱

现阶段照片的运用早已涉及到到了各行各业,无论是互联网上的社交媒体還是较为重特大场所...

日期:2021-01-25 浏览次数:187

个性化logo照片大全集的设计方案技能有哪些?

logo设计方案的构造1般是认真细致的,可是logo的设计方案几乎不会受到文本,照片,颜色的限...

日期:2021-01-23 浏览次数:60