透明贴图的问题

您所在位置:编程爱好者网站编程爱好者论坛 — 透明贴图的问题!TransparentBlt函数怎么用啊!急用。。。
原帖地址:http://bbs.pfan.cn/post-204973.html
主题:透明贴图的问题!TransparentBlt函数怎么用啊!急用。。。
作者:tmxk1983      发表时间:2006-11-20 15:26:00

楼主  

急用这个函数,现在学API恐怕来不及,会的交我下,谢谢!
下面是我网上搜到的透明贴图的问题解决方案,可是我看不懂!
用GDI来实现的话,有几种方法:
1 。 就是用单独的遮罩图。
2。最简单的方法是 用TransparentBlt函数 , 这个函数定义在msimg32.dll中,不过可惜vb自带的api viewer中没有,这需要自己写declare , 如下:
Public Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal HeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long
用法和bitblt相似,最后的crTransparent就是透明色.

3. 比较麻烦一点的,就是用几个Bitblt产生透明效果。参考一下我写的程序:
    maskDC = CreateCompatibleDC(0)   '1.建立单色mask DC
    maskBitmap = CreateBitmap(S_Width, S_Height, 1, 1, 0)
    SelectObject maskDC, maskBitmap
    
    SetBkColor foreDC, TransColor '2.把前景图的背景色设为透明色
    BitBlt maskDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCCOPY '3.copy前景图到单色DC得到mask

    SetBkColor foreDC, RGB(0, 0, 0)   '4.把前景图与mask图作与运算
    SetTextColor foreDC, RGB(255, 255, 255)
    BitBlt foreDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
    
    SetBkColor backDC, RGB(255, 255, 255)   '5.把背景图与mask图作与运算
    SetTextColor backDC, RGB(0, 0, 0)
    BitBlt backDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
    
    '6.把前景图和背景图作或运算
    BitBlt backDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCPAINT
    
    BitBlt T_DC, T_X, T_Y, S_Width, S_Height, backDC, 0, 0, SRCCOPY

假设我有个width=600,height=1600的BMP格式图,只有红白2色。我想显示时白色区域
是透明的请问该怎么写?请会的麻烦写下急等中。。。。

 

作者:rxw16826      发表时间:2008-11-7 5:56:00

 1楼  

TransparentBlt这个函数解析如下:
    函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。
    函数原型:BOOL TransparentBltm(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
    参数: 
    hdcDest:指向目标设备环境的句柄。(你要将贴图画上去的DC) 
    nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。(你将要贴图的左上角x相对坐标)
    nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。(你将要贴图的左上角y相对坐标)
    nWidthDest:指定目标矩形的宽度。(你的贴图的宽,不要超过目标DC的宽)
    nHeightDest:指定目标矩形高度的句柄。(你的贴图的高,不要超过目标DC的高)
    hdcsrc:指向源设备环境的句柄。(已经存储了贴图的DC,即已经把贴图选做操作对象的DC) 
    nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。(准备剪切贴图的左上x坐标,取0得了)
    nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。(取0得了)
    nWidthSrc:指定源矩形的宽度。(贴图宽)
    nHeightSrc:指定源矩形的高度。
    crTransparent:源位图中的RGB值当作透明颜色。(贴图中要滤掉的颜色)
    返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。 
    Windows NT:若想获取更多错误信息,请调用GetLastError函数。
    备注:函数TransparentBlt支持4位/像素和8位/像素格式的源位图,使用AlphaBlend可以指定带有透明度的32位/像素格式的位图。如果源和目标矩形的大小不一致,那么将对源位图进行拉伸以与目标矩形匹配,当使用SetStretchBltMode函数时,BLACKONWHITE和WHITEONBLACK两种iStretchMode模式将被转换成TransparentBlt函数的COLORONCOLOR模式。目标设备环境指定了用于目标坐标的变换类型,而源设备环境指定了源坐标使用的变换类型。如果源位图或目标位图的宽度或高度是负数,那么TransparentBlt函数也不对位图进行镜像。
    速查:Windows NT:5.0及以上版本;Windows:98及以上版本;Windows CE:不支持;
    头文件:wingdi.h。
    库文件:作为一个资源包含在msimg32.dll中。
    【问题的解决】
    函数最后一个参数即要滤掉的颜色有两种表示方式,一种为RGB(红色值,绿色值,蓝色值),一种为16位进制数,如红色为0x000000ff,白色为0x00ffffff。如要滤掉图片中的白色,要先确认图片白色区域像素的色值是否都是0x00000000[RGB(255,255,255)],可以用带有调色板的图片编辑软件打开图片来检查,如是,把参数设成0x00000000就成了,如不是就麻烦了,建议用photoshop将图片白色区域全部刷成一个色值的颜色,记下这个色值,把参数设成此数值也能解决问题。
    【最后提醒】
    这个函数似乎不能对虚拟位图进行滤色。如在一个DC上用画笔画刷画个实心圆,当然要画到与此DC关联的虚拟位图上(否则也画不出来),然后用此函数滤色时就不行。
    【应用示例】
    (注意,用的是MFC对话框)
    如要将本地目录下的800*600大小的位图mm.bmp显示出来,应先将在项目资源中添加此图片文件,比如得到的图片资源号为IDB_BITMAP1,接下来添加代码为:
    1、包含头文件
    #include <wingdi.h>
    2、在对话框头文件中添加
    CBitmap m_bmp;
    3、在对话框初始化函数OnInitDialog()中加载位图
    m_bmp.LoadBitmap(IDB_BITMAP1);
    4、在绘制函数OnPaint()的else内添加
        //自定义绘制
    CDC* cdc = GetDC();     //前台DC
    CDC bufferDC;           //后台DC
    CDC tempDC;    //临时DC
    CBitmap bufferBMP;  //后台DC位图
    //DC关联
    bufferDC.CreateCompatibleDC(cdc);
    tempDC.CreateCompatibleDC(cdc);
    //后台DC位图关联        
    bufferBMP.CreateCompatibleBitmap(cdc,800,600);        bufferDC.SelectObject(bufferBMP);
    tempDC.SelectObject(m_bmp);
    bufferDC.TransparentBlt(0,0,800,600,&tempDC,0,0,800,600,RGB(255,255,255));
    //绘制到前台DC
    cdc->BitBlt(0,0,800,600,&bufferDC,0,0,SRCCOPY);
    //释放资源
    bufferBMP.DeleteObject();
    tempDC.DeleteDC();
    bufferDC.DeleteDC();
    this->ReleaseDC(cdc);
    //OK,这样就画出来了,并且滤掉图片中的白色(0x00000000)。

 


关于本站 - 网站导航 - 广告服务 - 联系站长 - BUG报告 - 友情链接 - 赞助本站
Copyright© 1999-2008 Programfan.com. All Rights Reserved
论坛制作&维护:Hannibal    Email: webmaster@pfan.cn
最佳浏览效果:IE6.0+ 或 FireFox 1.5+ 分辨率:1024*768
<script type="text/javascript"></script> <script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script> <script type="text/javascript"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值