2010-03-31 106 views
1

我有一系列的图像。每一个通常(但不总是)与前一个相似,更新3个或4个小矩形区域。我需要使用最少的磁盘空间来记录这些更改。简单而有效的方式来存储图像的一系列小变化?

源图像没有压缩,但我想要压缩deltas。

我需要能够重新创建图像完全按照输入

我的线沿线的思维的东西(所以有损视频编解码器是不恰当的。):

  • 复合新具有负的旧形象
  • 保存在任何通用格式的合成图像可以使用RLE压缩(可能是PNG)
  • 的图像通过增量合成之前的图像重新创建第二图像。

虽然图像有一个alpha通道,我可以忽略它的目的是为了这个功能。

是否有一个易于实现的算法或免费Java库的这种能力?

+0

因此,磁盘空间是主要的考虑因素,而不是构建增量的时间? – 2010-03-31 03:02:10

+0

@MaxGuernseyIII,是的,但那是因为我假设其他任务将主导CPU负载。我可能是错的。 – finnw 2010-03-31 03:07:49

回答

1

在仅包含更改(您可以使用PNG透明背景或某种统一颜色)的图像上,对现有无损压缩器(PNG,无损JPEG等)稍做试验。这些算法在压缩大多数常量的图像时非常有效,如果您不是专家,则无法击败它们。

0

如果更改要保持矩形,您可以分别保存这些部分,即原始图像加上更改及其位置。

+0

是的,这是一种方法。你知道一个算法来计算改变矩形的最小集合吗? – finnw 2010-03-31 03:09:20

+0

我认为你知道这些变化发生在哪里。如果不是这样,它可能不是正确的道路。 – paprika 2010-03-31 03:23:43

+1

你可能想看看ImageMagick的比较工具: http://www.imagemagick.org/script/compare.php 我猜他们的实施并不是最糟糕的,也许看看代码或询问邮件列表。 – paprika 2010-03-31 03:30:02

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 

遍历每个可能的矩形,并决定是否有是否更改,然后对它们进行编码。如果您需要...您可以添加其他散列轴而不是行和列,就像您可以将图片细分为区域并散列区域是否有任何更改一样,然后使用散列来决定区域是否需要被编码。您可以执行任意次数的操作,并且具有合理快速的算法,也可以生成小文件。

无论如何,我认为您最好的选择是建立一个已更改内容的地图,并使用总量来告诉您是否更改了区块以指导您的决策。如果你收集了足够多的这些数据,你甚至可以创建一些不同的算法,在不同的情况下做好工作,然后将它们放入一个责任链中,根据地图的特征和你构建的哈希来决定使用哪种算法。

相关问题