图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)

本文深入探讨了LCD显示的基本原理,解释了为何一个像素通常需要多个字节表示,以及如何通过调色板技术减少framebuffer的存储空间,从而优化显示效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
在这里插入图片描述

一 what

(1)显示原理
我们知道,芯片控制LCD显示的时候,芯片会将需要显示的每个像素送给LCD,显然芯片内部是按照一个一个像素来处理的。
但是一个像素并不等于一个Byte,这又是为什么呢?一般一个像素由RGB三个元素组成,如果一个Byte表示一个像素,那么这个Byte分配给R、G、B分量的位数就更少了,这样表示的颜色范围就会非常少?因此我们需要两个或者更多的Byte表示一个像素,比如RGB565就需要2个Byte来表示一个像素,RGB888需要3个Byte表示一个像素,甚至有些RGB888需要4个Byte表示一个像素(这个像素中多了一个A分量,实际上是RGBA8888)
在这里插入图片描述
(2)调色板
如下图所示,假设一款ARM SoC驱动控制一个LCD屏幕显示,此过程中是如何工作的呢?我们主要看两个步骤

1. LCD controller从frame buffer中取出数据。有人会问这个数据是怎么产生的呢?这个就要看不同使用情况了,下面举了两个例子
	(a) 比如我想在LCD上画线,我肯定知道画线需要的数据,准备好这个数据即可
	(b) 如果想要在LCD上显示图片,那肯定有图片格式,把这个图片数据存在某个地方即可
2. LCD controller将取到的数据送到LCD控制线上,传到LCD上即可

在这里插入图片描述
显然上面是一个简单的使用场景,但是考虑一个的问题

假设我的LCD的分辨率是1280x720,格式是16bpp的,也就是RGB565,一个16bit的数据,高5位表示R,中间6位表示G,低5位表示B。那么在这个简单的例子中,我们需要多大的存储空间?
1280x720x16=14745600bit=1843200Byte=1800KB≈1.75MB,显然这个存储空间已经不小了

那么针对上面的问题,有没有什么减小存储空间大小的办法呢?
既然我们想要减小存储空间frame buffer的大小,但是这个frame buffer是对应LCD每个像素上的值,所以frame buffer的个数是无法减小的,它还是只能等于分辨率(1280x720)。
我们只能减小它的位数,之前frame buffer中每个数组项的内容是一个16bit的数据,我们可否使用8bit来表示呢?这样frame buffer的大小空间就减小了一半。但是如果用8bit来表示实际的RGB颜色的话,也无法表示RGB565中的三个分量,这时我们就引入了调色板palette,它是如何工作的呢?

1. LCD controller从frame buffer中取出数据,注意此时的数据不代表像素数据有效值,只代表像素值的索引。注意这里有两个数值,假设我们把frame buffer看成一个数组,那么数组下标代表是哪个像素,数组元素代表这个像素所需要的真正的颜色数据,即为像素值。
2. 根据像素值索引,到调色板中找像素值。
3. 将取出的像素值送到LCD控制线上,传给LCD。

在这里插入图片描述
这时,我们再来看看占用的实际内存空间大小

1. frame buffer大小 = 1280x720x8 = 7372800bit = 921600Byte = 900KB
2. 调色板palette大小 = 256x16 = 4096bit = 512Byte
3. 总大小 = frame buffer大小 + 调色板palette大小 = 921600Byte + 512Byte
显然比第一种case中占用的内存大小小了差不多一半

当然因为调色板中的像素值是一个16bit,这是因为LCD的型号决定的。如果不考虑LCD的型号,我们也可以设置32bit,24bit。这样我们只需要修改调色板中的像素值即可,也就是说调色板占用的内存大小是可以变化的,framebuffer的大小只需要保证和分辨率大小一致就可以了。
(3)颜色对照表CLUT

循环通过最后使用的Chrome标签使用快捷键。 此扩展程序试图模仿Windows(或Mac中为Command + TAB)中的ALT + TAB行为,以允许以“最近使用”的方式在打开的选项卡之间进行切换。它会记住切换选项卡的顺序(使选项卡处于活动状态),并更新其记录,以便您可以快速切换到最近使用的记录。注意:有时,在更新扩展名后,键盘快捷键设置会重置。因此,您可能需要在Chrome扩展程序页面的键盘快捷键设置中再次设置所需的键盘快捷键。请评分和评论。该项目在GitHub上开源:https://github.com/harshayburadkar/clut-chrome-extension.git默认键*:ALT + W:快速切换ALT + S:正常切换ALT + Shift + S:正常切换(方向相反)*可以在Chrome扩展程序页面的键盘快捷键设置中更改键 =快速切换=:用于快速切换到上个选项卡(按次)或倒数第二个使用过的选项卡(通过快速按两次),依此类推 =普通开关=:当您要查找最近使用的选项卡但希望以较慢的速度运行时(需要瞥眼以查看它是否是所需的页面)时,请使用此按钮。大多数其他扩展是要完成的由于Chrome API存在些限制/困难,因此同样的方法不能很好地发挥作用。此扩展使用些基本算法和按键间隔时间计时器来克服这些问题。这就是使用不同的计时器设置分别使用快速和慢速开关的键的原因。功能:*可以按最近使用的顺序在所有Chrome窗口中循环浏览所有打开的标签页*扩展程序无需访问您访问的网站的任何数据*可以在不同的Chrome窗口中浏览标签页*快捷快捷的常见问题解答:-为什么有两组快捷方式,组用于快速切换,另组用于慢速切换。是否有可能像ALT + TAB样简化行为?答:Chrome API中存在些限制,因此很难以最自然的方式实现此功能。目的是使此扩展名在Windows(或Mac的Cmd + Tab)中接近Alt + Tab。不幸的是,由于这些限制,此扩展依赖于两次按键之间的时间间隔。这就是为什么存在快速切换(更快的计时器)和正常切换(更慢的计时器)概念的原因 -在哪里可以更改用于切换标签的快捷键?答:要更改快捷方式,请转到Chrome浏览器中的“扩展程序”窗格,然后在扩展程序列表的底部找到“键盘快捷键”链接。您可以在此处更改已安装的扩展程序和应用程序的键盘快捷键。注意:如果Chrome本身使用该快捷方式,或者系统级操作需要该快捷方式,则可能不允许Chrome设置很少的快捷方式。随时发布反馈,评论和建议。 支持语言:English
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值