2013-05-06 38 views
0

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

它看起来不像samemap在这种情况下,Bitmap类中提供的方法很有用。

我想要实现它的另一种方法是使用.getPixel()方法并比较两个图像,这会缺乏效率。

+0

方法是什么?什么编程库/语言? – 2013-05-06 21:17:13

+0

我相信这是Java,也许在Android上? – Murkaeus 2013-05-06 21:26:30

+0

在Android上开发,对不起,我忘了指定 – Matt 2013-05-07 13:13:01

回答

0

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

编辑(基于评论反馈): 如果您的系统需要频繁发生大量更改,您可以采用散列样本文件中的散列位。多少取决于您希望改变的像素数量(基于历史数据)以及您需要采样多少以获得95%的统计置信区间。

如果它说文件是相同的,那么你可以回头比较每个位(或存储的完整文件的散列)。这会加速预期发生很多变化的情况,并且您只想确认用户实际进行了更改。

这会限制您不得不引用原始文件中的位的次数。

+0

应该指出的是,散列只是引入了不必要的开销 - 你仍然需要迭代像素+做其他操作。即使您多次比较图像,哈希方法可能无法提供好处,因为在许多情况下,只需查看几个像素即可预测差异。 – denver 2013-05-07 04:22:12

+0

诚然,如果您不希望经常更改,则散列算法运行良好。如果图像更改是系统中的常态,那么效率就会降低。提问者没有指定后面的情况,所以我们只能猜测。 – 2013-05-07 04:29:37

0

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

由于对图像的大多数改变都是靠近像素组而成,而不仅仅是一个像素,所以这有可能改进每像素检查的简单性。

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

等级1 - 50

等级2 - 25,75

等级3 - 12,37,62,87

等级4 - 6,18,31,43,56,68 ,81,93

如果您发现更改,请停止。最糟糕的情况是,没有改变,你检查每个像素。

让我知道你是否在寻找别的东西,或者如果你需要帮助实施它。

+0

这听起来不是非常高效的缓存。随着一张大图像,你会跳过内存。我相信做顺序比较会更好。 – 2013-05-06 21:48:58

+0

@KevinHsu这取决于情况,但也许你是对的。如果是java/android,这个问题是相关的:http://stackoverflow.com/questions/4011327/alternative-to-bitmap-getpixel – Murkaeus 2013-05-06 23:06:59

0

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