【问题标题】:Efficient RLE ideas for bit-wise data位数据的高效 RLE 理念
【发布时间】:2017-02-15 15:47:20
【问题描述】:

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

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

我倾向于对数据使用分离平面排列(如使用的 Amiga 上的 ILBM)——也就是说,不是将每个像素的所有位存储在一起,而是将整个图像的所有第一个位存储在一起,其次是第二位,等等。这对于处理不是二次方的图像深度变得更有效(您是否尝试过将 3 位数据打包到 8 位数据流中?)。

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

我可以坚持处理 8 个块中的位并查找重复字节的传统方法(2 个或更多相同,替换为 2 相同,然后计算运行中的数量),但我可以当涉及到将包含一个单一位平面的按位数据时,我认为这不是那么好。 (顺便说一下,ILBM 使用了多种这种逐字节方法 - 将数据纯粹作为字节处理,并根据需要重复它们,并使用定义如何处理下一个字节的“标题”字节)。

另一种方法是使用交替位计数方法。也就是说,开始假设该位为 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

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

【问题讨论】:

    标签: compression lossless-compression


    【解决方案1】:

    位图图像的压缩问题几十年来一直是研究的主题,因此您可以直接使用其结果,即 JBIG2。您可以 google 获取开源 JBIG2 代码。

    【讨论】:

    • 当您有相同数据块的重复模式(例如,页面上的字符)并且针对单个 1 位位图进行了优化时,JBIG2 看起来很高效。对于多位平面图像,您不会经常得到那些重复的图案,尤其是当图像是字体中的单个字形或图标时。我们在这里谈论可能有几千像素的位平面(48x48 将是每个位平面 2304 位)。我知道这听起来并不多,但是当你有几百个,并且只有几百 kB 的存储空间时,大小很重要。
    • 将灰度图像分解为平面正是 JBIG2 的使用方式。它很可能在您的数据上表现得比您在短时间内尝试的任何东西都要好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多