RGB888-RGB565

2024-04-16 07:58
文章标签 rgb888 rgb565

本文主要是介绍RGB888-RGB565,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天在REVIEW代码的时候,发现了这样一个宏定义:

#define COLOR_TO_MTK_COLOR_SIMUL(color) ((((color) >> 19) & 0x1f) << 11) \
                                            |((((color) >> 10) & 0x3f) << 5) \
                                            |(((color) >> 3) & 0x1f)

大家知道这个宏是用来干什么的吗?

仔细分析后,原来就是实现了RGB888到RGB565的转换,查阅相关资料后,发现网络上有一篇牛人写的东东,在此和大家分享。

讲一下量化压缩与量化补偿吧

  在进行色彩格式转换的时候,经常会遇到色彩量化位数的改变,比如说从 24bit RGB888 到 16bit RGB565 的色彩转换。所谓量化压缩与量化补偿都是我个人所提出的概念,现说明如下。

  量化压缩,举例:

  24bit RGB888 -> 16bit RGB565 的转换

  24ibt RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0

  16bit RGB656 R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3

  量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了压缩,却损失了精度。

  量化补偿,举例:

  16bit RGB565 -> 24bit RGB888 的转换

  16bit RGB656 R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

  24ibt RGB888 R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0 0 0 0

  24ibt RGB888 R4 R3 R2 R1 R0 R2 R1 R0 G5 G4 G3 G2 G1 G0 G1 G0 B4 B3 B2 B1 B0 B2 B1 B0

  说明:第二行的 24bit RGB888 数据为转换后,未进行补偿的数据,在精度上会有损失

  第三行的 24bit RGB888 数据为经过量化补偿的数据,对低位做了量化补偿

  可以很容易的证明,这样的补偿方法是一种合理的线性补偿。补偿的原理很简单,大家仔细想一下就明白了,因此不再详细说明。

  总结一下:

  量化压缩的方法:三个字取高位

  量化补偿的方法:

  1. 将原数据填充至高位

  2. 对于低位,用原始数据的低位进行补偿

  3. 如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿

  解释一下循环补偿的概念:

  8bit RGB332 -> 24bit RGB888 的转换

  8bit RGB332 R2 R1 R0 G2 G1 G0 B1 B0

  24bit RGB888 R2 R1 R0 0 0 0 0 0 G2 G1 G0 0 0 0 0 0 B1 B0 0 0 0 0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 0 0 G2 G1 G0 G2 G1 G0 0 0 B1 B0 B1 B0 0 0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 R2 R1 G2 G1 G0 G2 G1 G0 G2 G1 B1 B0 B1 B0 B1 B0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 R2 R1 G2 G1 G0 G2 G1 G0 G2 G1 B1 B0 B1 B0 B1 B0 B1 B0

  看了这个,应该明白则么回事了吧,其中B分量,进行了四轮的补偿,达到要求。

  量化补偿的必要性,从直觉上讲,我所提出的这种补偿方法是正确的(因为我并没有严格的去证明),进行这样的补偿,在做色彩各式转换的时候,能够明显的改善色彩效果,减少精度上的损失。

  对256色调色板模式的认识和应用,顺便讲一下这个,因为量化压缩和量化补偿刚好可以应用到调色板模式下。大家都知道,很早以前就有人提过出256色的标准调色板的概念(有的人又称之为抖动调色板或者万能调色板),其实这样的调色板并不神秘。256色中,一个像素点用8bit表示,那么如果采用 8bit RGB332 的格式,一切问题都可以想通,并且可以进行很好的处理了。对于每个 RGB332 的颜色,都可以使用量化补偿的做法,将其转换为 24bit RGB888 的颜色格式,然后将其设置为调色板即可。这样,实质上是将256色调色板模式,转换为了 8bit RGB332 的像素格式。这样的调色板方式,更加利于某些方面的处理,比如调色板匹配、Alpha混合等。由于采用了这样的方法,一个像素点的颜色值,与其实际的RGB颜色值,可以很方便的通过量化补偿的方法转换出来,然后就可以对各个颜色分量进行计算,计算完毕,再使用量化压缩的方法,就可以生成最终需要的颜色值。而所谓的调色板匹配的问题,当然也更加好解决了。关键是要把问题想通,把握事物的本质,才能找到简单而优美的解决问题的方法。

  以前我对标准调色板的认识也存在很多错误,导致在分析和解决问题上,没有能找到最好的方法。网上也有许多人写过有关256色模式下 Alpha Blending 的文章,但是都存在许多认识上的不足,导致最后给出的算法时间和空间的复杂度都太大。我也有过一篇有关256色Alpha混合的文章,但限于当时对事物的认知能力,因此现在看来以前的许多文章是惨不忍睹。大家都在进步,以后有机会再将新的认识写成文章,同大家分享。


这篇关于RGB888-RGB565的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908222

相关文章

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、

BMP位图原理深度解析及编程实现RGB565图片格式转换

1、前言         在Windows的画图软件中可以看到,常见的BMP有如下图所示的几种:单色位图、16色位图、256色位图和24位位图,其颜色深度分别为1、4、8、24。         在一些单片机设备中的LCD显示屏幕中,仅仅支持RGB565这一类的16位颜色深度图像,否则图片显示会有异常。但是在Windows中,并没有直接提供16位颜色深度的BMP图片,需要通过特殊的方式去生

RGB565,RGB8888等相关

RGB格式编辑 对一种颜色进行编码的方法统称为“ 颜色空间”或“ 色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做

Android 大图片加载 ARGB_4444 ARGB_8888 RGB565

Android 虚拟机默认为每个应用分配16M堆内存。ps:google原生OS的默认值是16M,但是各个厂家的OS会对这个值进行修改。   当在界面显示图片时,需要的内存空间不是按图片的实际大小来计算的,而是按像素点的多少乘以每个像素点占用的空间大小来计算的。图片加载到内存中需要把每一个像素都加载到内存中. 所以对内存的要求非常高, 一不小心就会造成OOM(OutOfMemoryErr

RGB565到RGB24转换

方式一: #define RGB565_MASK_RED 0xF800 #define RGB565_MASK_GREEN 0x07E0 #define RGB565_MASK_BLUE 0x001F unsigned short *pRGB16 = (unsigned short *)lParam; for(int i=0; i<176*144; i++) {     unsi

STM32F4驱动OV2640获取JPG图片和RGB565格式图片-下位机

目录     1 环境 2 相关硬件 2.1 DCMI 2.2 按键 3 STM32CubeMX配置 3.1 SWD仿真接口 3.2 时钟配置 3.2.1 引脚 3.2.2 时钟树 3.3 I2C 3.4 DCMI 3.4.1 基本配置 3.4.2 配置DCMI的引脚 3.4.3 开启DCMI的DMA模式 3.4.4 开启中断 3.5 USART3 3.6 工

Matlab处理彩色图像 RGB888-RGB565

image=imread('E:\64c.bmp'); fr=image(:,:,1); fg=image(:,:,2); fb=image(:,:,3); 以上代码为打开bmp图片并分开RGB三种分量,所以怎么把RGB888转化成RGB56516位真彩色呢? “著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:萧Brenda 链接:http

失败的2x2 Mipi Raw10转RGB565

反转了,有思路改了,待我思考一番。 --------------------------------------------------------------------------------------------------------------------------------- 希望完成的目标: MIPI在解析以后是四个像素四个像素地产出数据, 我原本希望能够通过2x2窗口

Bayer 模式图像(bggr ,grbg, gbrg)转rgb888

1.Bayer 模式图像 Bayer 模式是一种用于数字图像捕捉的常见模式,特别是在单个传感器摄像头中广泛使用。Bayer 模式是一种通过排列红、绿、蓝滤色阵列以及插值算法来捕捉彩色图像的技术。 Bayer 模式图像是由一个仅包含红、绿、蓝三种颜色中的一种的滤色阵列构成的,其中每个像素只能感知其中一种颜色的光。这种滤色阵列的排列方式通常遵循一种固定的模式,比如 BGGR、RGGB 或者类似的方