0

我正在寻找一种有效的方法来查看位图是否已被修改。我目前采用的方法是在每个图像的 Bitmap 类中使用方法 copyPixelsToBuffer(Buffer dst)。然后我可以比较这两个缓冲区,看看是否有区别。

看起来 Bitmap 类中提供的 sameAs 方法在这种情况下没有用。

我正在考虑实现它的另一种方法是使用 .getPixel() 方法并比较两个图像,这将缺乏效率。

4

3 回答 3

0

对于两个图像数据缓冲区的简单比较,您可以执行二进制搜索以查找更改。

这有可能改进简单的每像素检查,因为对图像的大多数更改都是在非常接近的像素组中进行的,而不仅仅是一个像素。

因此,例如,如果数组长度为 100,您可以按以下顺序检查索引。

1 - 50 级

2级 - 25, 75

3级 - 12、37、62、87

4级 - 6、18、31、43、56、68、81、93

等等

如果你发现变化,停下来。最坏的情况是,没有任何变化,您检查每个像素。

让我知道您是否正在寻找其他东西,或者如果您需要帮助来实施它。

于 2013-05-06T21:44:09.247 回答
0

如果您试图有效地检测图像是否已更改,最好计算原始图像的 SHA1 哈希并存储它。然后,在比较可能更改的图像时,您只需打开新图像并散列这些字节,然后与原始图像的 20 字节散列进行比较。如果两个图像相同,则哈希值将相同。如果图像不同,则 SHA1 哈希值也会不同。

编辑(基于评论反馈):如果您的系统预计会频繁发生大量更改,您可以对文件中的位进行分布式采样以获取哈希值。多少取决于您希望更改的像素数(基于历史数据)以及您需要采样多少才能获得 95% 的统计置信区间。

如果它说文件相同,那么您可以回退到比较每一位(或完整文件的存储哈希)。对于预期会发生大量更改并且您只想确认用户确实进行了更改的情况,这将加快流程。

这将限制您必须引用原始文件中的位的次数。

于 2013-05-07T01:15:49.027 回答
0

只需获取表示图像数据的缓冲区并循环通过比较它们的值的像素。

于 2013-05-07T18:00:15.690 回答