说明:本次实验绘图使用的是windows GDI 的SetPixel函数。
在windows7中对话框大量使用透明的元素,但是这些对话框是如何看起来透明的呢?
以前我是这么认为的:比如在白色的背景下显示一个150*150像素点的50%透明的红色方块,显示的方式是有0.5*150*150个红色(0xff0000)像素点随机分布在150*150的方块内,但是实验出来的效果是这样的,如下图
像素点随机分布实现的“透明”!!!
后来呢听同学说一般透明的显示方式是:背景像素RGB*透明度+显示前景像素RGB*(1-透明度) = 最终透明显示效果像素点的RGB ,也就是说所谓的透明其实是一种单色,透明也只是视觉上看起来透明罢了!比如上面50%透明(白色背景,红色透明)白色RGB=0xffffff ,红色RGB=0xff0000 ,那么最终透明效果的像素RGB=0xff7f7f ,最终效果
下图
重新计算像素点RGB实现的透明
上图中共有3个方块,细心观察你会发现其实两个红色透明方块是一样的但是前一个一眼就可以看出透明,但是后一个就觉得是粉色方块了。。这是我刚才说的透明其实只是视觉上看起来罢了。再上一张“全家福”
放了几个可以对照看一下。
最后再科普一下像素颜色。(参考http://blog.csdn.net/skyflying2012/article/details/8004078)
常见的颜色有 8位16位 24位32位色,其中24位及以上称为真彩,是PC
最常用的颜色,其他基本用于嵌入式系统或一些工控领域,详情如下表:
Bit-深度 色彩数
1 2 (monochrome)
2 4 (CGA)
4 16 (EGA)
8 256 (VGA)
16 65,536 (High Color, XGA)
24 16,777,216 (True Color/真彩色, SVGA)
32 16,777,216 (True Color + Alpha Channel/控制透明度,-游戏特效)
关于256色,早先的一些较为形象的解释是理解为256个油漆桶/256色
色板,分配给它们编号/索引号。“叫到哪个颜色”哪个颜色就出来填
像素。因为如16色、256色的色彩数有限所以这么解释很简单易理解。
而电脑操作过程中必须经过数码编码,那么实际上256种颜色对应256
数码(二进制数值),也就是2^8=256,256色模式下电脑没有必要去
24bit处理,在当时DOS时代,处理8bit色彩比24bit要容易多了。
当然256色中的任意一种颜色都可以用24bit表示,甚至可以用32bit
64bit表示。但是不管如何,24bit模式就意味着 2^24种颜色。256色
式就意味着256种颜色,或者理解为24bit的2^24种颜色中的256个
色。
256色模式: 共8 bits (B: 2 bits; G: 3 bits; R: 3 bits)。
High color:共16 bits (B: 5 bits, G: 6 bits, R: 5 bits)。
True color:一般24bit就是8bit/通道,真彩色。
windows下的32位是R、G、B三个通道各占8位共24位,加上明度通道8位,所以是32位,24位也就是R、G、B三个通道各占6位共18位,加上明度通道6位,所以是24位。
32位色中的24位用来保存颜色信息(R8G8B8),另外的8位用来保存ALPHA信息,ALPHA属性就是透明度!
24位色也有几种表示,可以是R5G6B5,也可以是R5G5B5,等等。
什么是RGB
RGB是表示红色绿色蓝色又称为三原色光,英文为R(Red)、G(Green)
B(Blue),在电脑中,RGB的所谓”多少”就是指亮度,并使用整数来表示。
通常情况下,RGB各有256级亮度,用数字表示为从0、1、2至255。虽然数字最高是255,但0也是数值之一,因此共256级。按照计算,256 级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2 的24次方)。
对于单独的R或G或B而言,当数值为0时,代表这种颜色不发光;如果为255,则该颜色为最高亮度。因此当RGB三种色光都发到最强的亮度,纯白的RGB值就为255,255,255。屏幕上黑的RGB值是0,0,0。R,意味着只有红色存在,且亮度最强,G和B都不发光。因此最红色的数值是255,0,0。同理,最绿色就是0,255,0;而最蓝色就是0,0,255。黄色较特殊,是由红色加绿色而得就是255,255,0
24bit 和 32bit 是一样的,由于24bit不能在显存中对齐,所以不是所有的显卡都能支持。反而 32bit 因为可对齐,大多数的显卡都支持(当然显存要足够大)。32bit实际上也是24bit,一般都在 MSB 上填充 8bit 的 0 或 alpha (没有实际效果)。