2013-05-06 36 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

只需獲取表示圖像數據的緩衝區,並通過比較其值的像素進行循環。