关闭

图片透明效果处理

1851人阅读 评论(0) 收藏 举报

          由于所有的图文件都是以一个四方矩形的形式来存储的,但有时我们可能会需要把一张怪物图片贴到窗口的背景上,而在这种情况下我们如果直接进行贴图的话,就会把这张图片的背景也一起贴到窗口背景图片中去,这当然不是我们想要的,所有我们就有必要把要贴的图片的不需要的部分给去了,就是所谓的图片透明效果处理。

          主要就是利用BitBlt()贴图函数以及Raster值的运算来将图片中不必要的部分去掉(又称去背),使得图中的主题可以与背景图完全融合。制作透明效果有多种方法,但基本上都是利用贴图时不同的Raster运算,通过转换而最后产生相同的透明效果。在这里先来介绍一种透明运算的方法: 

      首先得准备一张位图:

 

图中左边的图是要去背并贴到背景上的前景上的前景图,右边的黑白图称为“屏蔽图”,在透明的过程中会用到它。把要去背的位图与屏蔽图合并成同一张图,透明的时候再按照需要来进行裁切。可以把它分成两张图,但这样程序就得运行两次图文件的加载的操作。下面的贴图步骤:

   (1):将屏蔽图与背景图做“AND"(Raster值为SRCAND)运算,贴到目的地DC中;

  (2):将前景图与背景图作“OR”(Raster值为SRCPAINT)运算,贴到目的DC中。

为什么这样就会产生透明的效果呢?

这是因为:白色的RGB值为(255,255,255),二进制即为  111111111111......

黑色的RGB值为(0,0,0),龙江二进制即为  000000000000......

运算过程:

1:屏蔽图与背景图做“AND”运算

(1)屏蔽图中的图中的黑色部分与背景图作”AND“运算:

            000000........---------------------屏蔽图中黑色图点的颜色值

AND)011010.......---------------------背景图中彩色图点的颜色值

           000000.....------------------------运算后为黑色

(2)屏蔽图中的白色部分与背景图做”AND“运算:

             11111........---------------------屏蔽图中白色图点的颜色值

AND)011010.......---------------------背景图中彩色图点的颜色值

             011010.....------------------------运算后还是原来背景图的色彩

2,前景图与背景图作”OR”运算:

(1)前景图中的彩色部分与上面运算后的图作“OR”运算:

            101011........---------------------前景图中彩色图点的颜色值

OR) 000000.......---------------------背景图中变成黑色图点的颜色值

             101011.....------------------------运算后变成前景图的色彩

(2)前景图中的黑色部分与上图运算后的图作“OR”运算:

             000000........---------------------前景图中黑色图点的颜色值

OR)  101010.......---------------------背景图中彩色图点的颜色值

             011010.....------------------------运算后还是原来背景图的色彩

经过这一运算后所显示的画面就是所需要的透明图了。

Note;

BOOL BitBlt( HDC  目的DC ,//贴图

                       int  目的DC X坐标,  int  目的DC Y坐标,  int  贴到目的DC的宽度,

                       int   贴到目的DC的高度,   HDC  来源DC,   int   来源DC X坐标,   int   来源 DC Y坐标,

                      DWORD   贴图方式);

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:117021次
    • 积分:2050
    • 等级:
    • 排名:第18683名
    • 原创:79篇
    • 转载:6篇
    • 译文:0篇
    • 评论:21条
    文章分类