我正在寻找一种有效的方法来查看是否修改了位图。我目前采用的方法是在Bitmap类中为每个图像使用copyPixelsToBuffer(Buffer dst)方法。然后,我可以比较这两个缓冲区,看看是否存在差异。
它看起来不一样Bitmap类中提供的方法在这种情况下很有用。
我想要实现它的另一种方法是使用.getPixel()方法并比较两个图像,这将缺乏效率。
答案 0 :(得分:0)
对于两个图像数据缓冲区的简单比较,您可以对更改执行二进制搜索。
这有可能改进简单的每像素检查,因为大多数图像变化都是在非常接近的像素组中进行的,而不仅仅是一个像素。
因此,例如,如果数组长度为100,则可以按以下顺序检查索引。
等级1 - 50
2级 - 25,75
等级3 - 12,37,62,87
等级4 - 6,18,31,43,56,68,81,93
等
如果发现更改,请停止。最糟糕的情况是,没有任何变化,你检查每个像素。
如果您正在寻找其他内容或者如果您需要帮助来实现它,请告诉我。
答案 1 :(得分:0)
如果您试图有效地检测图像是否已更改,则最好计算原始图像的SHA1哈希并存储它。然后,在比较可能更改的图像时,您只需打开新图像并将这些字节哈希,然后与原始图像的20字节哈希进行比较。如果两个图像相同,则哈希值将相同。如果图像不同,SHA1哈希也会不同。
编辑(根据评论反馈): 如果您的系统期望经常发生许多更改,您可以采用分布式样本来获取散列文件中的位。多少取决于您期望更改的像素数(基于历史数据)以及需要采样的数量以获得95%的统计置信区间。
如果它说文件是相同的那么你可以回过头来比较每一位(或整个文件的存储哈希值)。这将加速预期会发生大量更改并且您只是想确认用户实际进行了更改的方案的过程。
这将限制您必须引用原始文件中的位的次数。
答案 2 :(得分:0)
只需获取表示图像数据的缓冲区,然后循环比较其值的像素。