FRAMEBUFFER 显示原理及RGB显示


framebuffer / 像素深度 / 颜色深度 / RGB565


1, framebuffer相关的.
    framebuffer的可变的信息就是指Framebuffer的长度、宽度以及颜色深度等信息。
这两个命令字相关的结构体有两个:struct fb_fix_screeninfo和struct fb_var_screeninfo,这两个结构体都比较大,前者用于保存Framebuffer设备的固定信息,后者用于保存Framebuffer设备的可变信息。在调用ioctl()的时候,要用到这两个结构体。应用程序中通常要用到struct fb_var_screeninfo的下面这几个字段:xres、yres、bits_per_pixel,分别表示x轴的分辨率、y轴的分辨率以及每像素的颜色深度(颜色深度的单位为bit/pixel),其类型定义都是无符号32位整型数。


2, rgb相关的.
   对于彩色图像,每个像素通常用三个分量表示,即R(Red)、G(Green)、B(Blue)三个分量,每个分量用一个字节表示,因此每个分量的取值范围从0到255;对于灰度图像,每个像素通常用一个分量表示,一个分量同样由一个字节表示,取值范围从0到255。


3, framebuffer和rgb配合.
    由于所用的Framebuffer设备的颜色深度为16位,颜色格式为5-6-5格式——即R(红色)在16bit中占据高5位,G(绿色)在16bit中占据中间6位,B(蓝色)在16bit中占据低5位
对于24位的RGB,每个字节表示一个颜色分量,因此转换的方式为:对于R字节,右移3位,对于G字节,右移2位,对于B字节,右移3位,然后将右移得到的值拼接起来,就得到了16位的颜色值。在后面的程序中,将把24位的颜色称为RGB888,而把16位颜色值称为RGB565,这种命名方式可能不太规范,不过无论如何,在本文中就这样称呼了


4, 像素深度
    像素深度是指存储每个像素所用的位数,它也是用来度量图像的分辨率。像素深度决定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。
例如,一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24,每个像素可以是16 777 216(2的24次方)种颜色中的一种。在这个意义上,往往把像素深度说成是图像深度。表示一个像素的位数越多,它能表达的颜色数目就越多,而它的深度就越深。
虽然像素深度或图像深度可以很深,但各种VGA的颜色深度却受到限制。例如,标准VGA支持4位16种颜色的彩色图像,多媒体应用中推荐至少用8位256种颜色。由于设备的限制,加上人眼分辨率的限制,一般情况下,不一定要追求特别深的像素深度。此外,像素深度越深,所占用的存储空间越大。相反,如果像素深度太浅,那也影响图像的质量,图像看起来让人觉得很粗糙和很不自然。
    在用二进制数表示彩色图像的像素时,除R,G,B分量用固定位数表示外,往往还增加1位或几位作为属性(Attribute)位。例如,RGB 5∶5∶5表示一个像素时,用2个字节共16位表示,其中R,G,B各占5位,剩下一位作为属性位。在这种情况下,像素深度为16位,而图像深度为15位。属性位用来指定该像素应具有的性质。例如在CD-I系统中,用RGB 5∶5∶5表示的像素共16位,其最高位(b15)用作属性位,并把它称为透明(Transparency)位,记为T。T的含义可以这样来理解:假如显示屏上已经有一幅图存在,当这幅图或者这幅图的一部分要重叠在上面时,T位就用来控制原图是否能看得见。例如定义T=1,原图完全看不见;T=0,原图能完全看见。
在用32位表示一个像素时,若R,G,B分别用8位表示,剩下的8位常称为α通道(alpha channel)位,或称为覆盖(overlay)位、中断位、属性位。它的用法可用一个预乘α通道(premultiplied alpha)的例子说明。假如一个像素(A,R,G,B)的四个分量都用规一化的数值表示,(A,R,G,B)为(1,1,0,0)时显示红色。当像素为(0.5,1,0,0)时,预乘的结果就变成(0.5,0.5,0,0),这表示原来该像素显示的红色的强度为1,而现在显示的红色的强度降了一半。
用这种办法定义一个像素的属性在实际中很有用。例如在一幅彩色图像上叠加文字说明,而又不想让文字把图覆盖掉,就可以用这种办法来定义像素,而该像素显示的颜色又有人把它称为混合色(key color)。在图像产品生产中,也往往把数字电视图像和计算机生产的图像混合在一起,这种技术称为视图混合(video keying)技术,它也采用α通道。



5, 颜色深度.
   颜色深度(Color Depth)用来度量图像中有多少颜色信息可用于显示或打印像素,其单位是“位(Bit)”,所以颜色深度有时也称为位深度。常用的颜色深度是1位、8位、24位和32位。
1位有两个可能的数值:0或1。较大的颜色深度(每像素信息的位数更多)意味着数字图像具有较多的可用颜色和较精确的颜色表示。

因为一个1位的图像包含2种颜色,所以1位的图像最多可由两种颜色组成。在1位图像中,每个像素的颜色只能是黑或白;一个8位的图像包含256种颜色,或256级灰阶,每个像素可能是256种颜色中的任意一种;一个24位的图像包含1670万(2^24)种颜色;一个32位的图像包含2^32种颜色,但很少这样讲,这是因为32位的图像可能是一个具有Alpha通道的24位图像,也可能是CMYK色彩模式的图像,这两种情况下的图像都包含有4个8位的通道。图像色彩模式和色彩深度是相关联的(一个RGB图像和一个CMYK图像都可以是32位,但不总是这种情况)。

下表列出了常见的色彩深度、颜色数量和色彩模式的关系。

色彩深度      颜色数量           色彩模式
1位           2(黑白)           位图
8位           256                索引颜色
16位           65536 灰度,     16位/通道
24位           16.7百万           RGB
32位           CMYK,               RGB
48位           RGB,               16位/通道


32位的图像也可以是黑白的,那么只有两种颜色了。
-------------------------------------------------------------------------------

根据BPP的不同,修改相应位的显存数据。

传入的颜色数据一般都是32bit的,即格式为:0x00RRGGBB,

对于8PP,通过的是调色板索引实现的。

对于16PP,需要进行颜色转换。

对于32PP,大小刚好对应。


本文学习于 : framebuffer / 像素深度 / 颜色深度 / RGB565

补充内容:

计算机颜色格式( 8位 16位 24位 32位色)

FRAMEBUFFER 显示调用驱动内容


发布了335 篇原创文章 · 获赞 676 · 访问量 133万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览