1、为什么RGB888要转RGB565呢,这个问题尤其在嵌入式lcd屏中,因为RGB888占用24位,RGB565占用16位及2个字节。

2、例如嵌入式中的LCD屏接口一般位IIC、SPI、8080等,如果传送RGB888每个像素点就要多送一个字节,320*240的LCD屏就要多送76800字节的数据。

3、我看到的一般驱动代码中均是将RGB888进行相与移位等操作得到R,G、B类似操作。速度慢代码不精简。如何优化呢,这里我就开门见山了,使用结构体就能很好解决RGB888和RGB565互转。单使用结构体还不够好,就把结构体和共用体结合了。

4、以下是测试部分,使用原始方案RGB888转RGB565,及原始方案RGB565转RGB888,及新的方案。不难发现新方案测试结果和旧方案一样。

5、最后贴出具体代码,当前使用的是小端模式,切记51单片机一般位大端模式。

//作者:金丝草
//时间:2022/09/24#include <iostream>//这里重申下,以下为小端模式/***********************************RGB888 RGB565*************************************/
typedef union
{uint32_t RGB888;struct{uint32_t dummy0:3;uint32_t RGB_B :5;uint32_t dummy1:2;uint32_t RGB_G :6;uint32_t dummy2:3;uint32_t RGB_R :5;uint32_t dummy3:8;}Work;
}RGB888_struct;
typedef union
{uint16_t RGB565;struct{uint16_t RGB_B :5;uint16_t RGB_G :6;uint16_t RGB_R :5;}Work;
}RGB565_struct;//输入一个RGB888的32位数据地址,返回转换后的RGB565
static uint16_t RGB888_To_RGB565(const RGB888_struct *RGB888)
{RGB565_struct RGB565 = { 0 };RGB565.Work.RGB_R = RGB888->Work.RGB_R;RGB565.Work.RGB_G = RGB888->Work.RGB_G;RGB565.Work.RGB_B = RGB888->Work.RGB_B;return RGB565.RGB565;
}
//输入一个RG565的16位数据地址,返回转换后的RGB888
static uint32_t RGB565_To_RGB888(const RGB565_struct *RGB565)
{RGB888_struct RGB888 = { 0 };RGB888.Work.RGB_R = RGB565->Work.RGB_R;RGB888.Work.RGB_G = RGB565->Work.RGB_G;RGB888.Work.RGB_B = RGB565->Work.RGB_B;return RGB888.RGB888;
}
/***********************************RGB888 RGB565*************************************/static void test_RGB888_To_RGB565(void)
{uint32_t color888 = 0;uint32_t i;for (i = 1; i <= 50; i++){printf("RGB888->RGB565 =%5d  ", RGB888_To_RGB565((RGB888_struct*)&color888));color888 += 100;if ((i % 5) == 0)printf("\r\n");}printf("\r\n");
}
static void test_RGB565_To_RGB888(void)
{uint16_t color565 = 0;uint32_t i;for (i = 1; i <= 50; i++){printf("RGB565->RGB888 =%7d  ", RGB565_To_RGB888((RGB565_struct*)&color565));color565 += 100;if((i%5) == 0)printf("\r\n");}printf("\r\n");
}int main()
{uint32_t test_data = 0;uint32_t i;uint32_t color888 = 0;uint16_t color565 = 0;uint8_t R = 0;uint8_t G = 0;uint8_t B = 0;for (i = 1; i <= 50; i++)//原始方案计算伤脑子{R = (color888 & 0xff0000) >> (16 + 3);G = (color888 & 0x00ff00) >> (8 + 2);B = (color888 & 0x0000ff) >> 3;test_data = (R << (5 + 6)) | (G << 5) | B;printf("test__888->565 =%5d  ", test_data);color888 += 100;if ((i % 5) == 0)printf("\r\n");}printf("\r\n");test_RGB888_To_RGB565();//新方案速度更快还不伤脑子for (i = 1; i <= 50; i++)//原始方案计算伤脑子{R = (color565 & 0xf800) >> (5 + 6);G = (color565 & 0x07e0) >> 5;B = (color565 & 0x001f) >> 0;test_data = (R << (16 + 3)) | (G << 8 + 2) | (B << 3);printf("test__565->888 =%7d  ", test_data);color565 += 100;if ((i % 5) == 0)printf("\r\n");}printf("\r\n");test_RGB565_To_RGB888();//新方案速度更快还不伤脑子std::cout << "Hello World!\n";
}

关于RGB888和RGB565互转代码实现方案推荐相关推荐

  1. 使用neon实现RGB888转RGB565

    RGB888转RGB565使用C代码来实现是非常简单的,但就是比较耗时,使用NEON很容易实现这个功能,而且速度还能有很大的提升,以下是将16个RGB888像素点转为RGB565的代码 uint8x1 ...

  2. 转: RGB565、RGB888互相转换原理和代码

    转:http://www.xuebuyuan.com/935987.html 背景:在我们的计算机中图像是以RGB888格式显示图像的,24位图每个像素保存了32bit的数据,即RGB888+Alph ...

  3. RGB888转RGB565

    今天在REVIEW代码的时候,发现了这样一个宏定义: #define COLOR_TO_MTK_COLOR_SIMUL(color) ((((color) >> 19) & 0x1 ...

  4. js对象(Object)和字符串(String)互转 - 代码篇

    文章目录 js对象(Object)和字符串(String):相互转化 1. 利用原生JSON对象,将对象转为字符串 截图如下: 2. 从JSON字符串转为对象 相关文章:[localstorage本地 ...

  5. Python 儒略日和公历互转代码

    Python 儒略日和公历互转代码 # python3#------------------------------------------------------------------------ ...

  6. RGB888 和 RGB565

    今天作练习,是一个将RGB888的图像转换成RGB565在ARM 的 LCD上显示的小程序.里面的移位来移位去的完全不了.先是不管三七二是一,把程序运行了一下.图像是一行一行刷出来的,点是一个一个一行 ...

  7. RGB888和RGB565屏幕显示效果区别

    很想测试一下RGB888和RGB565屏幕的显示区别 用image2lcd把图片转换一下, 屏幕分辨率为800x480 1 以下是对比: 左边RGB888 右边RGB565

  8. RGB888与RGB565颜色

    颜色名称 RGB888原色 RGB565还原色 英 RGB888[Hex] RGB888_R[Hex] RGB888_G[Hex] RGB888_B[Hex] RGB565[Hex] RGB565_R ...

  9. php推荐码生成,最新最全PHP生成制作验证码代码详解(推荐),验证码详解_PHP教程...

    最新最全PHP生成制作验证码代码详解(推荐),验证码详解 1.0 首先先看代码 好,现在结合以上代码,来分析分析以上用到的几个函数: ① imagecreatetruecolor(); imagecr ...

  10. vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...

    大家好,我们今日继续讲解VBA代码解决方案的第115讲内容:工作表事件中,根据Target参数不同,实现精准控制触发事件的VBA代码第二方案.在上一讲中我们讲了利用Address的属性实现控制触发事件 ...

最新文章

  1. 利用 VMWare 搭建随机拓扑网络
  2. 发布新模板-画情画心
  3. IT项目监理的三种模式比较
  4. python在线教学-python在线教学
  5. java中如何关闭文件,在Java中捕获IOException后如何关闭文件?
  6. 【转】shell之for、while、until循环
  7. lambda函数if_Python3中lambda表达式与函数式编程讲解
  8. 14 exec/fork/wait cycles for Process Management
  9. Fedora17下安装OpenCV2.3.1[转]
  10. Silverlight3游戏开发之空当接龙基础篇
  11. php链接没有下划线,html超链接怎么去掉下划线
  12. PYTHON_错误处理
  13. 连接 RIP 与 OSPF 网络
  14. BZOJ1143[CTSC2008] 祭祀river
  15. Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略
  16. 如何将qlv格式视频转换成mp4格式
  17. 国产免费虚拟化OVM与 OpenStack对比
  18. 多测师肖sir_高级金牌讲师_项目介绍之保险项目的案例
  19. 网易云短信php接口,网易云音乐简单API
  20. app store账号申请和证书申请发布app

热门文章

  1. 后端学习 Java 面向指挥官的操作系统
  2. 十进制进制法_进制转换方法(进制转换方法的口诀)
  3. Nifi操作Redis
  4. VUE 文字转语音播放
  5. 我的保研之路-哈工大计算机,中科院信工所,复旦大数据学院
  6. 2020保研夏令营之路——武大网安、北理计算机、中科院信工所六室
  7. 基于双目深度估计的深度学习技术研究
  8. dlibdotnet 人脸相似度源代码_HAAR与DLib的实时人脸检测之实现与对比
  9. opencv python 人脸识别 相似度_Python学习:基于Opencv来快速实现人脸识别(完整版)...
  10. LabVIEW基于Kvaser USBcan的UDS烧录Hex文件