RGB565,RGB8888等相关

本文深入探讨了RGB颜色空间及其在网页应用中的表现形式,包括网页颜色编码规则、RGB到YUV的转换过程,以及RGB编码的不同类型,如RGB1、RGB4、RGB8、RGB555和RGB565,旨在为读者提供全面的RGB颜色编码知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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位相互转换的问题

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。
### RGB565RGB8888 的转换 RGB565RGB8888 是两种不同的色彩表示格式。前者使用 16 位存储红、绿、蓝三种颜色分量,其中红色占 5 位,绿色占 6 位,蓝色也占 5 位;后者则采用 32 位来表达这三者,每种颜色各占用 8 位,并额外增加一位透明度通道[^1]。 为了从 RGB565 转换至 RGB8888,在读取原始数据时需先提取出各个颜色组件对应的高五或六位数值,再将其扩展到完整的八位范围。具体操作如下: 对于每一个像素点的数据: - 将其拆分为代表 R/G/B 值的高低字节; - 对于红色部分 (R),移除低三位填充零作为新的高位,形成一个完整的字节; - 类似地处理绿色部分 (G),不过这里需要去掉最低两位并补充两个零; - 同样对待蓝色部分 (B),同样丢弃低位补足八个二进制数; - 设置 Alpha 通道全为最大值即不透明状态。 下面是基于上述逻辑编写的 Python 实现代码片段: ```python def rgb565_to_rgb8888(pixel_565): """ Convert a single pixel from RGB565 format to RGBA8888. :param pixel_565: An integer representing one pixel value in RGB565 format. :return: A tuple of integers (r, g, b, a), each ranging between 0 and 255 inclusive. """ r = ((pixel_565 & 0xF800) >> 11) * 255 / 31 g = ((pixel_565 & 0x7E0) >> 5) * 255 / 63 b = (pixel_565 & 0x1F) * 255 / 31 # Set alpha channel fully opaque since original data does not contain transparency information a = 255 return int(r), int(g), int(b), a # Example usage with test values test_pixels = [ 0xF800, # Pure red 0x07E0, # Pure green 0x001F, # Pure blue ] for pxl in test_pixels: converted_pixel = rgb565_to_rgb8888(pxl) print(f"Original Pixel Value ({pxl:#06x}): Converted To -> {converted_pixel}") ``` 此函数接收单个整型参数 `pixel_565` 表示一个以十六进制形式给出的 RGB565 编码后的像素值,并返回由四个元素组成的元组 `(r,g,b,a)` 来描述该像素在标准 ARGB 颜色模型下的表现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值