我有一系列图片。每个通常(但不总是)与前一个相似,更新了3或4个小矩形区域。我需要使用最少的磁盘空间记录这些更改。
源图像未压缩,但我希望压缩增量。
我需要能够完全按照输入重新创建图像(因此有损视频编解码器是不合适的。)
我正在考虑以下方面:
虽然图像有alpha通道,但我可以为了这个功能而忽略它。
是否有易于实现的算法或具有此功能的免费Java库?
答案 0 :(得分:1)
使用现有的无损压缩器 - PNG,无损JPEG等 - 对仅由更改组成的图像进行一些实验(您可以使用PNG的透明背景或某些均匀的颜色)。这些算法在压缩大多数不变的图像时非常有效,如果你不是专家,你将无法击败它们。
答案 1 :(得分:1)
如果矩形的数量通常很小,并且矩形本身很小,你可以制作出有差异的行和列,用它来提出可能不同的矩形......
想象一下具有以下像素值的图像......
0 0 0 1 1 1 2 2 3 3
0 0 1 1 0 0 1 1 2 2
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 0 0 1 1 1 1 1 0 2
2 2 2 2 2 1 1 2 2 2
...和...
0 0 0 1 1 1 2 2 3 3
0 1 1 1 0 0 1 1 2 2
0 1 2 4 0 0 0 1 1 2
0 1 2 3 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 3 3 2 1 2
0 0 1 1 0 3 3 2 1 2
0 0 0 1 1 2 2 2 0 2
2 2 2 2 2 1 1 2 2 2
首先,你会想出一个像素行,行和列有差异的掩码......
0 1 1 1 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0
1 0 1 1 1 0 0 0 0 0 0
1 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 1 1 0 0
1 0 0 0 0 0 1 1 1 0 0
1 0 0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0
行和列数据为我们提供了有关可能存在矩形的位置的指导...
0 1 1 1 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0
1 0 ? ? ? 0 ? ? ? 0 0
1 0 ? ? ? 0 ? ? ? 0 0
1 0 ? ? ? 0 ? ? ? 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
1 0 ? ? ? 0 ? ? ? 0 0
1 0 ? ? ? 0 ? ? ? 0 0
1 0 ? ? ? 0 ? ? ? 0 0
0 0 0 0 0 0 0 0 0 0 0
迭代每个可能的矩形并确定是否有变化然后对它们进行编码。您可以添加其他散列轴而不是行和列,如果您需要...就像您可以将图片细分为区域并散列区域是否有任何更改,然后使用散列来决定区域是否需要被编码。您可以执行任意次数并使用相当快速的算法来生成小文件。
无论如何,我认为最好的办法是建立一张已更改内容的地图,并使用汇总来告诉您是否已更改块以指导您的决策。如果你收集了足够的这些,你甚至可以创建几个不同的算法,在不同的情况下做好工作,然后把它们放在一个责任链中,根据地图的特征和你建立的哈希来决定使用哪种算法。 / p>
答案 2 :(得分:0)
如果更改将保持矩形,您可以单独保存这些部分,即原始图像加上更改及其位置。