针对逐位数据的高效RLE想法

时间:2017-02-15 15:47:21

标签: compression lossless-compression

我的一个主要项目是微控制器的显示库。作为其中的一部分,我有一组字体(位图)和图标(alpha通道)。

由于微控制器中的资源(闪存和RAM)受限,我正在寻找更好的方法来存储这些字体和图标的数据。

我倾向于对数据使用分离平面排列(如使用的Amiga上的ILBM) - 也就是说,不是将每个像素的所有位存储在一起,而是将整个图像的所有第一位存储在一起,然后是第二位,等等。这对于处理不是2的幂的图像深度变得更有效(你尝试将3位数据打包成8位数据流吗?)。

我还想压缩每个位平面。 RLE似乎是最明智的。但是,由于我现在正在使用位流而不是整数,我想知道实现RLE的最佳方法是什么。

我可以坚持传统的方法来处理8块中的位并查找重复的字节(2个或更多相同,替换为2相同,然后计算运行中的数量),但我可以&当看到包含一个单一位平面的逐位数据时,就会发现它非常棒。 (顺便说一下,ILBM使用各种这种逐字节方法 - 将数据纯粹视为字节,并根据需要重复它们,并使用" header"字节定义下一个字节的处理方式。) / p>

另一种方法是使用交替位计数方法。也就是说,开始假设该位为0,并记录运行中该位的数量。然后切换到1并记录运行中的1位数。然后再次切换回0并记录位数。等

同样,如果你有相同位的长时间运行,那就很好了,但是一旦你得到快速的位变换,你最终会占用大量的空间(8位,比如01010101,最终为[1,1,1,1,1,1,1,1])的8个字节。

这里任何事情的主要警告是它必须是高效的 - 在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

然而,这个大小的字形我甚至不太可能尝试压缩。它足够小,毫无意义。但是,它说明了位平面的分层以及比特流相对于原始数据的外观。

1 个答案:

答案 0 :(得分:0)

压缩位图图像的问题几十年来一直是研究的主题,所以你可以使用它的结果,即JBIG2。您可以谷歌搜索开源JBIG2代码。