代码之家  ›  专栏  ›  技术社区  ›  finnw

简单但有效的方法来存储图像的一系列小变化?

  •  1
  • finnw  · 技术社区  · 14 年前

    我有一系列的图片。每个区域通常(但并非总是)与前一个区域相似,更新了3个或4个小矩形区域。我需要使用最小的磁盘空间来记录这些更改。

    源图像没有压缩,但我希望对delta进行压缩。

    我需要能够完全按照输入重新创建图像(所以有损视频编解码器是不合适的)。

    我在考虑以下几点:

    • 用旧图像的负片合成新图像
    • 将合成图像保存为可以使用rle(可能是png)压缩的任何通用格式。
    • 通过将前一个图像与增量合成来重新创建第二个图像。

    尽管这些图像有一个alpha通道,但为了实现这个功能,我可以忽略它。

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   AVB    14 年前

    在仅包含更改的图像上(可以对PNG使用透明背景或某种统一颜色),对现有的无损压缩程序(png、无损jpeg等)进行一点实验。这些算法在压缩一个基本不变的图像时非常有效,如果你不是专家的话,你将无法打败它们。

        2
  •  1
  •   MaxGuernseyIII    14 年前

    如果矩形的数目通常很小,而矩形本身也很小,则可以绘制出有差异的行和列,并使用它们来生成可能不同的矩形…

    想象一下具有以下像素值的图像…

    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
    

    迭代每个可能的矩形,确定是否有更改,然后对其进行编码。如果需要,可以添加其他哈希轴而不是行和列…就像可以将图片细分为区域并散列区域是否有任何更改一样,然后使用散列来决定是否需要对区域进行编码。你可以做任意次数,并有一个相当快速的算法,也可以产生小文件。

    不管是什么情况,我认为你最好的选择是建立一个已经改变的地图,并使用聚合来告诉你是否已经改变了块来指导你的决策。如果你收集了足够多的这些,你甚至可以创建几个不同的算法,在不同的环境下做得很好,然后把它们放在一个责任链中,根据你构建的地图和散列的特性决定使用哪种算法。

        3
  •  0
  •   paprika    14 年前

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

    推荐文章