扫码加入

  • 资料介绍
  • 在线预览
  • 相关推荐
申请入驻 产业图谱

一个 TouchGFX 图片压缩导致显示丢失的问题

2025/03/04
664
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一个 TouchGFX 图片压缩导致显示丢失的问题

1.20 MB

1、引言

在使用 TouchGFX 生成代码时,像图片、文本和字体这样的资源会被转换成 C++文件,然后与TouchGFX 应用程序代码、用户代码和 TouchGFX 库一起编译后存储在 Flash 中。 这意味着具有许多资源的大型或复杂项目会需要使用更多的 Flash 存储空间。由于大多数应用中的存储器资源都是有限的,因此有几种方法可以减少应用对 Flash 存储器容量的需求。TouchGFX 提供四项内置功能,可以帮助显著减少应用程序的 Flash 存储器需求。 这四项功能分别是 L8 图片格式、图片压缩、可缩放矢量图形(SVG)和矢量字体。本文只涉及图片压缩并会先介绍 TouchGFX 支持的图片压缩功能,然后结合客户使用 TouchGFX图形压缩功能出现图片显示丢失的问题进行分析。

2、TouchGFX 的图片压缩功能

2.1. TouchGFX 图片压缩功能简介

TouchGFX 从 4.22 版开始支持图片压缩。4.22 to 4.23 只支持 L8 格式的图片压缩。从4.24 版本开始,支持 RGB565, RGB888, 以及 ARGB8888 压缩。图片压缩通常有两种风格:无损或有损。 有损图片压缩通过去除图片的微小细节来实现。 这样通常会得到最大的缩减图片,但原始图片无法准确再现。 无损压缩总是无任何差异地再现原始图片,无损压缩的尺寸缩减通常较小。对于图形,通常要求 UI 元素完全按照其设计来绘制。 因此,TouchGFX 只支持无损压缩。图片压缩的优点是存储空间需求减少,但也有缺点,因为图片在绘制到帧缓存时必须解压缩。 与绘制未压缩的图片相比,这种解压缩在许多情况下需要 CPU 做更多的工作。 结果可能是性能下降。这意味着必须将 Flash 减少带来的优势与 CPU 使用率增加带来的劣势进行权衡。STM32 中的图形加速器 DMA2D 和 GPU2D(ChromART and NeoChromGPU)不能直接绘制压缩图片。压缩图片使用软件硬件渲染的混合方式进行绘制,即压缩数据由软件分块解压缩,然后在适用的情况下将这些分块委托给 DMA2D 处理。许多应用中,不建议压缩所有图片,而是只压缩那些性能不受影响且与减少 Flash 相关的图片。

2.2. TouchGFX 支持的压缩方式

2.2.1 L8 压缩

L8 位图格式仅适用于高达 256 色的图片。 每个像素只是一个 8 位数字,表示与图片一起存储的颜色表中的一种颜色。L8 的压缩只是像素编号的压缩。颜色表保持不变。压缩的L8 图片像普通的未压缩位图一样使用。 关于 L8 像素格式可以参考:使用 L8 图片格式减少存储空间消耗 | TouchGFX Documentation如果我们使用 L8 压缩 28,121 字节的一个图片,像素数据将减少到 5,735 字节。压缩图片数据(包括颜色表)的总大小小于原始图片的 20%。因此,压缩允许我们在同一个 Flash空间中拥有 5 个不同的背景或者将 Flash 需求减少 28,121 字节。压缩的 L8 图片可以像普通的未压缩位图一样使用。 例如,您可以使用图片控件显示图片,而无需在 TouchGFXDesigner 或代码中对项目进行任何修改。L8 图片转换器支持三种压缩算法(L4、RLE、LZW9)。

  • L4,对每个像素进行 4 比特编码。 仅适用于最多 16 种颜色的图片。
  • RLE,像素的游程编码。 仅适用于最多 64 种颜色的图片。
  • LZW9,基于词典的编码。 适用于所有 L8 图片。

RLE 算法的解压缩速度比 LZW9 快得多,因此如果 LZW9 仅压缩图片,转换器将选择RLE 稍微好一点。

在线预览

相关推荐