请注意,我不是要求创建图像文件的“可视差异”。我想知道是否有适用于图像文件的Unix命令行diff / patch实用程序。
到目前为止,我已经在两个图像文件上尝试了bsdiff和xdelta。一个文件是8000x8000的图片,并使用Gimp的“随机噪声”渲染器。另一个是相同的图片,上面画了一些蓝色线条进行了比较真实的测试。
以下是我的结果:
到目前为止,我已经在两个图像文件上尝试了bsdiff和xdelta。一个文件是8000x8000的图片,并使用Gimp的“随机噪声”渲染器。另一个是相同的图片,上面画了一些蓝色线条进行了比较真实的测试。
以下是我的结果:
$ time xdelta3 -e -s 1.png 2.png xdelta.patch
real 0m1.222s
user 0m1.106s
sys 0m0.114s
$ time bsdiff 1.png 2.png bsdiff.patch
real 0m20.860s
user 0m20.694s
sys 0m0.169s
$ ls -l 1.png 2.png xdelta.patch bsdiff.patch
-rw-r--r-- 1 mardok mardok 6278160 May 20 20:21 1.png
-rw-r--r-- 1 mardok mardok 6669305 May 20 20:32 2.png
-rw-r--r-- 1 mardok mardok 6682740 May 20 21:06 bsdiff.patch
-rw-r--r-- 1 mardok mardok 6678609 May 20 21:05 xdelta.patch
由于补丁比图像本身还要大,因此这两个工具都不适合这项工作。bsdiff尤其不适合,因为它需要20秒的时间。
那么,有没有其他类型的算法可以用于图像差异比较呢?
编辑:我刚刚进行了另一次测试,但这次将图像保存在Gimp的本地.xcf格式中。结果更好了。
$ ls -l 1.xcf 2.xcf xcf.bsdiff xcf.xdelta
-rw-r--r-- 1 mardok mardok 54693130 May 20 21:38 1.xcf
-rw-r--r-- 1 mardok mardok 53575879 May 20 21:38 2.xcf
-rw-r--r-- 1 mardok mardok 2758826 May 20 21:39 xcf.bsdiff
-rw-r--r-- 1 mardok mardok 3912197 May 20 21:41 xcf.xdelta
XCF文件比PNG文件大五倍,但差异要小得多。因此,似乎对PNG文件进行差异比较是很麻烦的。不过,我真的很想知道是否有一种实用程序可以处理PNG、JPG、TIFF或其他主流图像文件格式。
编辑2:现在加入了JPEG文件:
$ ls -l 1.jpg 2.jpg jpg.bsdiff jpg.xdelta
-rw-r--r-- 1 mardok mardok 2134569 May 20 21:49 1.jpg
-rw-r--r-- 1 mardok mardok 4509765 May 20 21:49 2.jpg
-rw-r--r-- 1 mardok mardok 3417896 May 20 21:50 jpg.bsdiff
-rw-r--r-- 1 mardok mardok 3917899 May 20 21:50 jpg.xdelta
我没有发布时间,但是bsdiff在JPEG文件上创建差异所花费的时间非常短。这是第一个差异,在其中一个图像产生了比原始文件更小的结果。然而,它仍然不够好,因为补丁需要明显地比两个文件都小。
更正:bsdiff花费的时间异常短是因为JPEG文件很小。糟糕。
编辑3:为了完整起见,这里是TIFF文件的结果:
$ ls -l 1.tiff 2.tiff tiff.xdelta tiff.bsdiff
-rw-r--r-- 1 mardok mardok 10182924 May 20 21:56 1.tiff
-rw-r--r-- 1 mardok mardok 11069486 May 20 21:56 2.tiff
-rw-r--r-- 1 mardok mardok 11077784 May 20 21:57 tiff.bsdiff
-rw-r--r-- 1 mardok mardok 11054104 May 20 21:56 tiff.xdelta
他们的测试结果与PNG测试相同。它们不适合这项工作。
总体而言,您应该不要在图像文件上使用典型的二进制差异比较。而应该使用哪种算法呢?