我的主要项目之一是一个用于微控制器的显示库。作为其中的一部分,我有一个字体(位图)和图标(alpha通道)的集合。
由于资源(闪存和RAM)在微控制器中是有限的,我正在寻找更好的方法来存储这些字体和图标的数据。
我倾向于对数据使用一种分离的平面安排(就像使用的Amiga上的ILBM ),也就是说,与其将每个像素的所有比特存储在一起,不如将整个图像的所有第一位存储在一起,然后存储第二位等等。这对于处理非幂的图像深度变得更有效了--2(您是否尝试过将3位数据打包到8位数据流中?)
然后,我还想压缩每一个比特平面。RLE似乎是最明智的。但是,由于我现在使用的是位流,而不是整数,所以我想知道实现RLE的最佳方法是什么。
我可以坚持传统的方法,在8块中处理比特,并寻找重复字节(2或更多相同,替换为2相同,然后计算运行中的字节数),但对于包含一个位平面的按位排列的数据,我看不出有那么好。(顺便说一句,ILBM使用了各种按字节划分的方法-将数据纯粹视为字节,并根据需要使用定义下一个字节如何处理的“头”字节来重复它们)。
另一种选择是使用交替位计数方法。也就是说,开始假设位为0,并在运行中记录该位的数量。然后切换到1,并记录运行中的1位数。然后再次切换到0,并记录位数。等。
同样,如果您有相同位的长时间运行,那么很好,但是一旦您得到比特的快速替换,您最终占用的空间就会大幅度增加(比如01010101,8位,最终可能是8字节的[1,1,1,1,1,1,1,1])。
这里的主要警告是,它必须是高效的--无论是在CPU中解压它,还是在它解压时在内存中保存任何工作缓冲区。这就是为什么我认为RLE而不是任何其他方法。
所以我想我是在寻找我错过的想法。在以字节为中心的系统中,压缩单比特流和表示压缩数据的最佳实现是什么?
例如字形(十进制):
00 00 02 14 03 00 00 00
00 00 09 13 10 00 00 00
00 00 13 05 13 00 00 00
00 05 12 00 12 06 00 00
00 11 15 15 15 11 00 00
00 14 02 00 01 14 00 00
08 12 00 00 00 12 08 00
11 07 00 00 00 07 12 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00因此,位平面0-3应该是
0 1 2 3
00001000 00111000 00010000 00010000
00111000 00001000 00010000 00111000
00111000 00000000 00111000 00101000
01000000 00000100 01101100 00101000
01111100 01111100 00111000 01111100
00001000 01100100 01000100 01000100
00000000 00000000 01000100 11000110
11000100 11000100 01000110 10000010
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000然而,这样大小的字形,我甚至不太可能尝试压缩。它小到没有意义。但是,它说明了位平面的分层以及比特流与原始数据的关系。
发布于 2017-02-15 19:17:57
几十年来,位图图像的压缩问题一直是研究的主题,所以您可以只使用它的结果,即JBIG2。您可以在谷歌上搜索开源JBIG2代码。
https://stackoverflow.com/questions/42253925
复制相似问题