金牌会员
 
- 积分
- 1268
- 金钱
- 1268
- 注册时间
- 2016-1-23
- 在线时间
- 493 小时
|
发表于 2025-8-15 00:38:38
|
显示全部楼层
/* 888色转565色 */
在C语言中,将8位RGB颜色(通常表示为24位颜色,即8位红色、8位绿色、8位蓝色)转换为16位RGB565颜色格式,可以通过位操作来实现。以下是简洁的代码示例:
```c
#include <stdint.h>
uint16_t RGB888_to_RGB565(uint8_t r, uint8_t g, uint8_t b) {
return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
}
int main() {
uint8_t r = 255; // 示例红色值
uint8_t g = 128; // 示例绿色值
uint8_t b = 64; // 示例蓝色值
uint16_t rgb565 = RGB888_to_RGB565(r, g, b);
printf("RGB565: 0x%04X\n", rgb565);
return 0;
}
```
代码说明:
• 输入参数:
• `r`、`g`、`b`是8位的红色、绿色和蓝色分量,取值范围为0到255。
• 位操作:
• `r >> 3`:将8位红色分量右移3位,保留高5位。
• `g >> 2`:将8位绿色分量右移2位,保留高6位。
• `b >> 3`:将8位蓝色分量右移3位,保留高5位。
• 使用位移操作将这些分量移动到RGB565格式的相应位置。
• 输出:
• 返回一个16位的RGB565值。
RGB565格式:
• RGB565格式中,红色占5位,绿色占6位,蓝色占5位。
• 比特分布为:`00000RRRRRGGGGGGBBBBB`。
示例运行:
假设输入的RGB值为`(255, 128, 64)`,对应的RGB565值为:
• `r = 255`,右移3位后为`31`(二进制`11111`)。
• `g = 128`,右移2位后为`32`(二进制`100000`)。
• `b = 64`,右移3位后为`8`(二进制`1000`)。
• 最终结果为`0b111111000001000`,即十六进制`0xFC8`。
希望这段代码对你有帮助!
/*------------------------------------------------*/
在C语言中,将24位色转换为16位色可以通过对RGB分量进行适当的缩放和位运算来实现。以下是一个简洁的代码示例:
代码示例
```c
#include <stdio.h>
// 将24位RGB颜色转换为16位RGB565颜色
unsigned short convert24To16(unsigned char r, unsigned char g, unsigned char b) {
// 缩放RGB分量
unsigned short red = (r >> 3) & 0x1F; // 8位到5位
unsigned short green = (g >> 2) & 0x3F; // 8位到6位
unsigned short blue = (b >> 3) & 0x1F; // 8位到5位
// 组合成16位RGB565格式
return (red << 11) | (green << 5) | blue;
}
int main() {
// 示例:24位RGB颜色(红色)
unsigned char r = 255, g = 0, b = 0;
// 转换为16位RGB565颜色
unsigned short result = convert24To16(r, g, b);
// 输出结果
printf("16位RGB565颜色: 0x%04X\n", result);
return 0;
}
```
代码说明
• RGB565格式:
• 16位颜色格式,其中红色占5位,绿色占6位,蓝色占5位。
• 24位RGB颜色的每个分量是8位(0-255),需要缩放到相应的位数。
• 缩放方法:
• 红色:`r >> 3`,将8位缩放到5位。
• 绿色:`g >> 2`,将8位缩放到6位。
• 蓝色:`b >> 3`,将8位缩放到5位。
• 位运算组合:
• 使用位移和按位或操作将缩放后的RGB分量组合成16位RGB565格式。
输出示例
假设输入的24位RGB颜色是红色(255,0,0),程序输出:
```
16位RGB565颜色: 0xF800
```
扩展
如果需要处理多个颜色,可以将`convert24To16`函数用于数组或其他数据结构中。
|
|