7917|26

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC下如何实现位图的透明效果?(高分请教高手) [复制链接]

如题,先谢谢了

最新回复

按道理是不会出现这样的问题,你是不是把 UINT iFixTransparency  = (UINT)(iTransparency * 256); UINT FixTransparency0 = (UINT)(Transparency0 * 256); 改为 unsigned short iFixTransparency  = (UINT)(iTransparency * 256); unsigned short FixTransparency0 = (UINT)(Transparency0 * 256); 之类的十六位整型了?这样的话会导致溢出的(而乘于256刚好不会溢出),要不你把代码贴出来,我们来看看哪里可能有问题?   详情 回复 发表于 2008-12-7 09:34
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
TransparentBlt(),去看EVC帮助
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
还有 TransparentImage, 呵呵,来混分
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
过来学习。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
TransparentBlt()这个是画掩码,比如你一张方图,只有中间的圆形区域是图像信息,那么你就把背景色设上,这样再画这幅图的时候背景就会被透明了,还有个ALPHABLEN,也就是@混合,是把一幅图透明的贴在另一幅图上。不知道你需求的是哪个,看看GDI的相关资料吧。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
http://tech.ddvip.com/2008-09/122085543061667.html
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

7
 
现在透明效果是做出来了啊,但是速度有点慢了,800x480的图片要3秒钟哦,哎,太慢了
我也不知道还能够怎么优化,我把代码贴出来,大家看看能不能帮我优化下,谢谢了

for(int i = 0 ; i < nHeight ; i ++)
{
    for(int j = 0 ; j < nWidth ; j++)
    {
        BYTE btB = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize];
        BYTE btG = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1 ];
        BYTE btR = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2 ];
                       
        BYTE btB1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize];
        BYTE btG1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize + 1];
        BYTE btR1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize + 2];
                       
        btB = btB1 * iTransparency + Transparency0 * btB;
        btG = btG1 * iTransparency + Transparency0 * btG;
          btR = btR1 * iTransparency + Transparency0 * btR;
                       
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize] = btB ;  
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1] = btG;
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2] = btR;                       
    }
}
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
现在透明效果是做出来了啊,但是速度有点慢了,800x480的图片要3秒钟哦,哎,太慢了
我也不知道还能够怎么优化,我把代码贴出来,大家看看能不能帮我优化下,谢谢了

for(int i = 0 ; i < nHeight ; i ++)
{
    for(int j = 0 ; j < nWidth ; j++)
    {
        BYTE btB = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize];
        BYTE btG = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1 ];
        BYTE btR = pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2 ];
                       
        BYTE btB1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize];
        BYTE btG1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize + 1];
        BYTE btR1 = pbtPixels1[i * nWidth * nPixelSize + j * nPixelSize + 2];
                       
        btB = btB1 * iTransparency + Transparency0 * btB;
        btG = btG1 * iTransparency + Transparency0 * btG;
          btR = btR1 * iTransparency + Transparency0 * btR;
                       
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize] = btB ;  
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 1] = btG;
        pbtPixels[i * nWidth * nPixelSize + j * nPixelSize + 2] = btR;                       
    }
}
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 

其中pbtPixels 指向要显示的图片,BYTE* 类型;
pbtPixels1 指向底面,即是显示的桌面的图片,也是BYTE* 类型;
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
不是吧,都说了系统自带@混合的API了:)ALPHABLEND啊。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 BEYONDMA 的回复:
不是吧,都说了系统自带@混合的API了:)ALPHABLEND啊。

--------------------------------------------------
ALPHABLEND是WINCE5.0以上版本才能用吧
我用的是WINCE4.0
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个问题貌似被提过多次了。

lz为什么不先搜索一下历史记录呢!!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 lenux 的回复:
这个问题貌似被提过多次了。

lz为什么不先搜索一下历史记录呢!!

-----------------------------
是吗
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
自己写的和系统那个效率是差不多的,而且你问题没说清楚,要的是半透明的效果,而不是透明效果。
你可以考虑不用所有像素都做alpha混合运算的
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 nbcool 的回复:
自己写的和系统那个效率是差不多的,而且你问题没说清楚,要的是半透明的效果,而不是透明效果。
你可以考虑不用所有像素都做alpha混合运算的

--------------------------------------------------------------------------------
半透明效果的话,就是乘以0.5,相当于向右位移一位,这时候可以用位移代替乘法,这样速度是很快的,

但是透明度不是0.5的话不能这样替换了,所以按以上的方法,速度很慢,不知道如何优化

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
如果要实现半透明,可以试试DirectDraw的overlay,效率会好一些。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
继续等待
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

19
 
听说嵌入汇编可以大大提高速度,可是我不懂汇编啊
在EVC中如何嵌入汇编呢?
等待懂汇编的高手
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 wh_peng 的回复:
听说嵌入汇编可以大大提高速度,可是我不懂汇编啊
在EVC中如何嵌入汇编呢?
等待懂汇编的高手


不用想这个问题了,效率也提高不了多少,特别是在应用层。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表