关于LCD显示屏颜色的适配方法

 一、基础知识

        如果说给一个关键词“颜色”,大家能联想起什么呢?是色彩斑斓的彩虹,还是红彤彤的太阳,亦或者是黄灿灿的麦地?小时候我们都学过光具有波粒二象性,从波的角度来看,光(电磁波)的不同频率对应着不同的颜色。其实颜色并不是光的属性,有关波的频率、振幅、相位、偏振方向等参数才是。人眼中的很多视锥细胞能够感受到某些特定频率的光,为了不混淆这些不同频率的光,我们才将其区分成不同颜色。

        光的频率是连续的,可见光的频率介于380nm ~ 750nm之间,所以从理论上来讲光的颜色是无穷无尽的。从硬件实现上显示所有的可见光是不可能的,那么显示器是遵循什么策略来实现色彩显示的呢?小时候学过三原色R、G、B可以叠加出各种不同的颜色,这种叠加原理同样应用在显示器上。如果使用放大镜仔细观察手机、电脑等屏幕,或许就能看出屏幕是由红色、绿色、蓝色三种不同的发光二极管(LED)组成的。或许这些LED排布方式不同,但都有这3种颜色的LED。

        这下我们清楚显示屏颜色由RGB组成的了,那么一个像素点由几个R、G、B构成呢?这里涉及到一个叫色彩深度的专业名词,在计算机图形学领域中色彩深度表示在位图或者视频帧缓冲区中储存1个像素点的颜色所用的位数,它也称为位/像素(bpp,bits per pixel)。我淘宝购买的1.8英寸LCD显示屏有128*160=20480个像素点,每一个像素点由5个R灯、6个G灯、5个B灯构成,显示的色彩深度只有5+6+5=16位,所以只能显示:R:2^{5}+G:2^{6}+B:2^{5}=2^{16}=65536种颜色。 

        现在大部分显示设备都是真彩色,色彩深度至少有24位,其中R、G、B各占8位,这样能够显示出全部色彩。当然有的屏幕色彩深度达到了32位,这是因为它增加8位可用来控制透明度的alpha通道。色彩深度越高,可用的颜色就越多。

二、颜色适配

        一般需要使用颜色适配的时候我们已经知道这个颜色是什么样子的,或者已经调试出这种颜色了。比如在做毕业设计的时候,想通过显示屏全屏显示出学校的校旗和校训,如果简单地把整个图片转换成由RGB565组成的图像文件当然没问题,但是这样太占内存空间了。RGB565占2个字节的内存空间,128*160*2=40KByte。如果简单地存储2张图片的话需要耗费80KB的存储空间,这对只有64K Flash的STM32F103C8T6来说好似是行不通的。

        但方法总比困难多,如果将两张图片缩小显为原来的1/4,每张图片直接由40Kb缩减为10Kb,这样我还是可以接受的。此外,在LCD显示屏后面预留了SPI接口的SD卡读写接口,不过设计时没有使用,而是采用IIC型的AT24C256(EEPROM)作为图片的存储介质。图片缩小后不能占满全屏,便想到填充图片边缘,这就是写这篇颜色适配的原因。效果如下图所示:

        对图片边沿颜色进行采样需要用到颜色识别工具,Photoshop以及一些在线网站都能完成这项工作,给大家找了一个网页版tool在线工具,本文以Photoshop的拾色器举例,步骤如下:

  1. 打开图片,使用拾色器拾取图片边沿颜色为:0x0067aa,图片识别的色彩深度为24-bit的RGB888,可以推出R=0、G=103、B=170
  2. 将RGB换算成二进制,即R=0B00000000,G=0B01100111,B=0B10101010
  3. 由于使用的RGB565 LCD不是真彩屏,只能舍掉颜色低位的精度(不能还原真实色彩,不过没办法),我们取RGB的高5、6、5位,低位补0
  4. 得出RGB=0B0000001100110101=0x0335  //学校校旗的蓝底

        如果自己一开始并不知道颜色,想要在特定图片的特定位置替换成自己调制的喜欢的颜色时,给大家推荐一个叫ColorSpace的在线调色板。 

猜你喜欢

转载自blog.csdn.net/fantastic_sky/article/details/110560615
今日推荐