qqTOTORO 发表于 2024-3-24 19:27:33

BMP图像18位转16位问题咨询

        硬件芯片使用ST7789V驱动320x*240的显示屏,显示的图片都是用16bit(R:5bit G:6bit B:5bit)的BMP图片。

现在需要用到从显示屏读屏幕显示数据回来,查看手册发现ST7789V数据都是18bit(即RGB分别是6bit数据位),输入的16bit的图片数据会被芯片自动转换成18bit才存储到芯片缓存。

现在实际测试单片机从ST7789V读数据回来,发现18bit的数据没办法完整转换成16bit图,R和B两个颜色都少了一个bit,观察数据发现,16bit到18bit也不是简单的把数据搬过去,有的数据搬过去RGB三个通道值都变化了。导致图片实际显示有杂质。

        请问有精通这块的大神能分享一下16bit转18bit(和18bit转16bit) BMP图片一般数据转换方式是怎么样的,或是ST7789V芯片的数据转换规则是怎么样的?

Himem 发表于 2024-3-24 20:23:12

把低位砍了再位移就可以了吧 目前回读"有杂质"的图有对比吗

t3486784401 发表于 2024-3-24 22:55:28

显示屏读回数据,是要做任意形状透明显示吧。

RGB565 转 RGB666 有多种方式,甚至有些场合直接是给你适配固定调色盘了,这个还得是你多实验下。

或者换思路,TFT只写不读,透明运算涉及的缓存全在单片机这边搞定

qqTOTORO 发表于 2024-3-24 23:44:30

t3486784401 发表于 2024-3-24 22:55
显示屏读回数据,是要做任意形状透明显示吧。

RGB565 转 RGB666 有多种方式,甚至有些场合直接是给你适配 ...
(引用自3楼)

对的,方法有解决了,实际效果好像一般。{:smile:} 如果要显示PNG图片,有相关的方法可以实现的了吗

qqTOTORO 发表于 2024-3-24 23:47:38

t3486784401 发表于 2024-3-24 22:55
显示屏读回数据,是要做任意形状透明显示吧。

RGB565 转 RGB666 有多种方式,甚至有些场合直接是给你适配 ...
(引用自3楼)

单片机要显示PNG格式可以实现的了嘛

t3486784401 发表于 2024-3-25 00:22:45

qqTOTORO 发表于 2024-3-24 23:44
对的,方法有解决了,实际效果好像一般。 如果要显示PNG图片,有相关的方法可以实现的了吗 ...
(引用自4楼)

我低端的单片机玩得多;ARM 能跑,但都是现成软件库

单片机软解 PNG,算法费劲+吃资源,到头来不如直接运算成 BMP+蒙版 来的划算。

我在 Arduino 的全局库当中帮你找下(包括给 32bit-ARM 用的库),
这个 PNGdec 直接要 48KB 运行内存,还没算上 FLASH 消耗:



当然如果有 OS,这都不是事儿。

t3486784401 发表于 2024-3-25 00:37:24

qqTOTORO 发表于 2024-3-24 23:47
单片机要显示PNG格式可以实现的了嘛
(引用自5楼)

库我帮你下下来了,C++ 源码,单片机足够大可以考虑折腾:

原始地址: https://downloads.arduino.cc/libraries/github.com/bitbank2/PNGdec-1.0.1.zip

项目地址: https://github.com/bitbank2/PNGdec

hexenzhou 发表于 2024-3-25 08:12:24

楼上真是热心人,赞一个。

lb0857 发表于 2024-3-25 08:28:57

t3486784401 发表于 2024-3-25 00:37
库我帮你下下来了,C++ 源码,单片机足够大可以考虑折腾:

原始地址: https://downloads.arduino.cc/l ...
(引用自7楼)

热心坛友为你点赞

qqTOTORO 发表于 2024-3-25 23:25:15

t3486784401 发表于 2024-3-25 00:22
我低端的单片机玩得多;ARM 能跑,但都是现成软件库

单片机软解 PNG,算法费劲+吃资源,到头来不如直接 ...
(引用自6楼)

谢谢,这个BMP+蒙版的方法我也有想过,但是好像没办法解决PNG半透明部分的显示,背景图如何跟图像做出融入的效果。有什么好的思路吗

cne53102 发表于 2024-3-25 23:55:01

qqTOTORO 发表于 2024-3-25 23:25
谢谢,这个BMP+蒙版的方法我也有想过,但是好像没办法解决PNG半透明部分的显示,背景图如何跟图像做出融 ...
(引用自10楼)

32位BMP带有一个alpha通道可以表达透明部分,压缩一点的话,也有16位带alpha的bmp,4位红色4位绿色4位蓝色4位透明。
当然,可以使用自定义位数,比如只有透明和不透明的部分,那么使用RGB555,然后多出来的一位表示透明。

t3486784401 发表于 2024-3-26 02:27:49

qqTOTORO 发表于 2024-3-25 23:25
谢谢,这个BMP+蒙版的方法我也有想过,但是好像没办法解决PNG半透明部分的显示,背景图如何跟图像做出融 ...
(引用自10楼)

本质都是 alpha 渲染,每个像素多一个 alpha 通道。

对于蒙版式前后景,相当于alpha 通道是二值的(0 vs 255);
对于 PNG 透明像素,alpha 通道是可以有灰度的,一般8bit (0-255).

至于怎么在屏上画,肯定要缓冲背景(或者读回背景)然后前后景按照 alpha 比例混合

yyts 发表于 2024-3-26 07:32:20

温铁军:中国房地产泡沫危机开始产生!

要不直接用lvgl

qqTOTORO 发表于 2024-3-27 17:19:31

t3486784401 发表于 2024-3-26 02:27
本质都是 alpha 渲染,每个像素多一个 alpha 通道。

对于蒙版式前后景,相当于alpha 通道是二值的(0 vs ...
(引用自12楼)

好的谢谢你,alpha通道像素应该是有一个混合的计算方法可以实现是吧,

qqTOTORO 发表于 2024-3-27 17:42:26

t3486784401 发表于 2024-3-26 02:27
本质都是 alpha 渲染,每个像素多一个 alpha 通道。

对于蒙版式前后景,相当于alpha 通道是二值的(0 vs ...
(引用自12楼)

有关于alpha 通道显示原理的资料帮我找点吗{:lol:}

liuqian 发表于 2024-3-27 19:12:22

有个stb lib,里面有图形库,可以看看
页: [1]
查看完整版本: BMP图像18位转16位问题咨询