本帖最后由 kiton_law 于 2010-4-20 21:38 编辑
一般有三种方式
1.通过三元光栅操作,先做一个掩码位图,对应图片需要显示的部分填充为全0(颜色是几位就填几位),对应图片透明部分填充为全1,图片中需要透明的部位填充为全0,先用掩码图和目标表面AND,然后用图片和目标表面OR
2.通过透明色表面过滤,透明表面是个单一颜色的图片,你要显示的图片的透明部分颜色应该和透明表面相同,先将透明色表面和目标表面XOR,再将图片与目标XOR,图片中与透明色表面同色的部分将会透明
3.通过透明色判断,设置透明色,在用图片填充目标表面时,判断图片象素是否和透明值相同,如果相同就不填充
1方法需要额外的和图片一样大的存储空间来存储掩码,并且每幅图片都需要一个掩码图,但是图片不透明的部分可以使用任何颜色,老式显示设备常用(因为一般不支持硬件透明表面)
2方法需要的空间稍小,一个透明表面可以用于过滤所有使用相同透明色的图片,但限制就是你所有用该表面过滤的图片都要使用相同的透明色,而且图片显示区域内将不能使用透明色,但这个不是大问题。在有硬件加速的图形处理器中,这种方法常用,它们一般都有一个硬件的过滤表面(你只需要设置表面的颜色值)
前两种方法都需要在读取目标表面象素值上有速度优势,否则就是出力不讨好。
3方法需要空间最小,并且无需提取目标表面的值(判断图片象素是否为透明值时是不需要目标数据的),适合空间小并且读取目标表面不便的情况下(比如使用MCU控制通过端口操作显存的LCD),但速度最慢,而且图片的显示部分也不能用透明色。
这几种方法各有优势,看具体硬件情况选择。
当然还有其他方式,但无非就是光栅操作的顺序和模式不同。
但在MCU的应用中方法3无疑最有前途,因为速度要求不高,而且资源有限,我都是使用第3种方法的,1方法和2方法一般在高级的图形引擎中才使用。
|