前言
在介绍透明换算前,先简单的介绍一下RGB和ARGB
RGB
RGB就是三原色( Red 红, Green 绿, Blue 蓝),所有的颜色都是这三种颜色以不同的强度组成的。而对于16 进制编码的颜色,我们可以这样理解,rrggbb六个字符:前两个表示红色,中间的两个表示绿色,后两个表示蓝色;那么,红色(red)ff0000,同样绿色(green)00ff00,蓝色0000ff;其它的颜色就是这几个字符(0-9,a-f)的组合.如果以10进制的表示方法,红色就是255 0 0,绿色是0 255 0,蓝色是0 0 255.而白色就是ffffff(也就是255 255 255),所以白色是强度最强的颜色.
- RGB格式
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
而常用格式如下:
-
网页格式
由于网页(WEB)是基于计算机浏览器开发的媒体,所以颜色以光学颜色RGB(红、绿、蓝)为主。网页颜色是以16进制代码表示,一般格式为#DEFABC (字母范围从A-F,数字从0-9 );如黑色,在网页代码中便是:#000000(在css编写中可简写为#000)。当颜色代码为#AABB11时,可以简写为#AB1表示,如#135与#113355表示同样的颜色。RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色)…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。
-
RGB555
RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
高字节 低字节
X R R R R R G G G G G B B B B B (X表示不用,可以忽略)
可以组合使用屏蔽字和移位操作来得到RGB各分量的值:
#define RGB555_MASK_RED 0x7C00
#define RGB555_MASK_GREEN 0x03E0
#define RGB555_MASK_BLUE 0x001F
R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31
- RGB565
RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:
高字节 低字节
R R R R R G G G G G G B B B B B
可以组合使用屏蔽字和移位操作来得到RGB各分量的值:
#define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31
#define RGB(r,g,b) (unsigned int)( (r|0x08 << 11) | (g|0x08 << 6) | b|0x08 )
#define RGB(r,g,b) (unsigned int)( (r|0x08 << 10) | (g|0x08 << 5) | b|0x08 )
友情提示:该代码可以解决24位与16位相互转换的问题
4. RGB24
RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue; // 蓝色分量
BYTE rgbtGreen; // 绿色分量
BYTE rgbtRed; // 红色分量
} RGBTRIPLE;
- RGB32
RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB24。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 蓝色分量
BYTE rgbGreen; // 绿色分量
BYTE rgbRed; // 红色分量
BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)
} RGBQUAD。
-
RGB颜色函数
RGB函数执行成功时返回由指定分量确定的颜色,用长整数表示。用于表示一个RGB(红绿蓝)颜色值。语法如下:
RGB (RedAs Integer ,GreenAs Integer ,BlueAs Integer )
参数说明:
参数 | 描述 |
---|---|
red | 必要参数,Integer类型。数值范围从 0 到 255,表示颜色的红色成份。 |
green | 必要参数,Integer类型。数值范围从 0 到 255,表示颜色的绿色成份。 |
blue | 必要参数,Integer类型。数值范围从 0 到 255,表示颜色的蓝色成份。 |
注意: 如果其中有一个参数的值超过 255 ,不会显示任何错误,但这个参数会被当做 255。
-
函数说明
可以接受颜色说明的应用程序的方法和属性期望这个说明是一个代表 RGB 颜色值的数值。一个 RGB 颜色值指定红、绿、蓝三原色的相对亮度,生成一个用于显示的特定颜色。用法RGB()函数使用下述公式计算表示颜色的长整数:Red+ 256 * Green+65536 *Blue其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,亮度越低,数值越大,亮度越高。
ARGB
ARGB是一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构。
ARGB 中的透明度alpha,表示的是不透明度。
ARGB 依次代表透明度(alpha)、红色(red)、绿色(green)、蓝色(blue)。以颜色值 #FF99CC00 为例,其中,FF 是透明度, 99 是红色值, CC 是绿色值, 00 是蓝色值。
透明度
- 透明度分为256阶(0-255),计算机上用16进制表示为(00-ff)。
- 透明就是0阶,不透明就是255阶,如果50%透明就是127阶(256的一半当然是128,但因为是从0开始,所以实际上是127)。
- 透明度 和 不透明度 是两个概念, 它们加起来是1,或者100%。
好了,明白了什么是rgb,argb,透明度,下面就看看具体的计算和换算吧。
如何换算
举个栗子
如果要求的颜色是#FFFFFF,透明度为40%。那么具体的换算步骤如下:
- 将透明度转换成不透明度(转换方式参考“透明度”,第2条) 。不透明度为60%
- 不透明度乘以255。 我们得到结果:153
- 将计算结果转换成16进制。得到最终的不透明度:99
- 将不透明度和颜色值拼接成ARGB格式。得到最终的颜色值: #99FFFFFF
下面介绍常用阶次的透明度的16进制对照表。
常用阶次透明度16进制对照表
透明度 | 16进制表示 |
---|---|
100% | 00 |
95% | 0D |
90% | 1A |
85% | 26 |
80% | 33 |
75% | 40 |
70% | 4D |
65% | 59 |
60% | 66 |
55% | 73 |
50% | 80 |
45% | 8C |
40% | 99 |
35% | A6 |
30% | B3 |
25% | BF |
20% | CC |
15% | D9 |
10% | E6 |
5% | F2 |
0% | FF |