我有一个带有图形用户界面的低资源嵌入式系统。界面需要字体数据。为了保存只读存储器(闪存),需要压缩字体数据。我正在寻找一种用于此目的的算法。
要压缩的数据的属性
压缩算法的要求
结论和想法
问题
目前最好的算法
为了给出一些背景信息,我能够弄清楚的最有用的算法如下:
此数据可以快速解压缩,因为base-3值可以通过一个小的(243 x 3 = 729个八位字节)查找表解码为base-4值。压缩比高度依赖于字体大小,但是根据我的典型数据,我可以得到1:2左右。由于这比LZ变体(大约1:3)差得多,我想尝试静态字典方法。
当然,通常的LZ变体使用霍夫曼或算术编码,这自然会使压缩数据变小。另一方面,我有所有可用的数据,压缩速度不是问题。这应该可以找到更好的词典。
由于数据的性质,我可以使用有损算法,但在这种情况下,最可能的有损算法将减少像素数据中的量化级别的数量。这不会对基础压缩问题产生太大影响,我希望避免产生比特对齐的麻烦。
答案 0 :(得分:3)
您可以考虑使用已经为类似于您的场景开发的内容
https://github.com/atomicobject/heatshrink
https://spin.atomicobject.com/2013/03/14/heatshrink-embedded-data-compression/
答案 1 :(得分:1)
您可以使用带有自定义词典的稀疏表示来尝试有损压缩。
每个字形的输出是字典中1-N块的叠加;
答案 2 :(得分:1)
似乎最简单的有损方法是减少每像素位数。对于这种大小的字形,16个级别可能就足够了。这会立即将数据减半,然后您可以将现有算法应用于值0,16或“其他内容”,或者将其再次减半。
答案 3 :(得分:1)
我会选择克利福德的答案,即首先将字体转换为每像素4位,足以完成此任务。
然后,因为这是一种字体,所以你有很多行重复,即定义一个字符的行与另一个字符的行匹配。以例如字母' p'并且' b',这些字母的中间部分应该是相同的(如果目标语言使用负载变音符号,您将获得更多匹配)。然后,您的编码器可以先收集字体的所有不同行,存储这些行,然后每个字符图像由指向行的指针列表组成。
效率取决于字体当然,取决于来源,您可能需要一些预处理来使用此方法更好地压缩。
如果你想要更多,你可能宁愿选择每像素3位甚至每像素2位,这取决于你的目标(以及一些用于手动调整字体图像的方法),这些可能仍然令人满意。 / p>
此方法总体上当然适用于实时显示(您只需要遍历指针以获取行数据)。