diff/patch for images

law*_*l0r 8 java diff image binary-diff

我正在编写一个项目,我需要通过网络传输一组类似的图像.为了加快速度,我想到了做大多数电影编解码器所做的事情.有关键帧,然后只发送更改.

现在,我得到的是一组BufferedImages所以与文本文件类似,我基本上只想区分它们并发送补丁.但是我以前从来没有真正使用过图像,所以如果我这样做的话,它会很糟糕.

那么,实现这样的事情的最佳方式是什么,或者这样的事情已经有了很好的实现?

我想将图像存储在一个字节数组和二进制diff中它们不会非常有效.

编辑:我需要传输这些图像.编辑2:与实现的具体细节不同之处在于:算法的最有效思想是什么.就像只使​​用5px块而不是忽略px如果它只是变化那么少,眼睛就不会注意到(我可以忍受一些质量损失)

Ali*_*ael 5

一种简单的方法是对两个图像进行等效的XOR运算.这将显示相​​同(将为零)的像素和已更改的像素(非零).

如果您不关心几乎难以察觉的差异,那么可选择使用"减法"混合然后右移以丢弃一个或两个比特的差异.

然后,您可以计算边界(可能是一个简单的矩形)并仅传输增量.delta可能包含很多零或最多几个字节,几乎没有最差的差异位 - 即,它将具有低'熵',这意味着理论上它应该使用当代压缩算法高度可压缩.

在接收端,反向过程同样简单.给定delta和边界框,解压缩delta,然后将其应用(XOR,或左移然后添加)到前一个/现有图像的受影响区域.

对于更复杂的无损方法,请研究动画GIF/PNG的动画方式以及用于计算/编码帧之间的增量信息的算法.例如,请参阅使用算法制作动画GIF的最佳方法是什么?

对于更复杂的方法,在处理真实世界的图像时,如果你愿意走有损路线 - 那么你已经暗示了它.看看视频编解码器如何编码/传输帧,例如MPEG视频编码.

不言而喻,因为在复杂性(编码/解码过程)和传输数据大小的减少之间存在权衡,你必须决定在任何一端计算中增加的开销是否值得节省传输.