2013-03-13 106 views
1

我已閱讀了很多關於stackowerflow的問題和解答,但仍找不到解決方案,它可以幫助解決我的問題。比較2 UIImage對象

所以我有2個真正大的圖像,我需要比較它們。

圖像不是用imageNamed:創建的,所以它們沒有兌現,所以[image1 isEqual:image2]應該不起作用。

對它們進行比較,因爲我知道唯一的解決辦法是這樣的一個:

- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2 
{ 
    return [UIImagePNGRepresentation(image1) isEqual:UIImagePNGRepresentation(image2)]; 
} 

但圖像有真正龐大的尺寸,所以它會採取一些時間來進行比較。

有沒有什麼屬性可以幫助不使用上面的方法來檢查它們是否相等?

例如,我可以得到image1.size並與image2.size比較,它們不相等,我不需要運行上面的方法。有任何想法嗎?謝謝。

+0

無論是否被緩存如果你已經在內存不要緊其指針地址。雖然我沒有嘗試過,但我沒有看到任何「isEqual:」不應該起作用的理由。你試過了嗎? – lnafziger 2013-03-13 15:39:45

+0

如何通過從UIImage繼承來創建自定義對象並將其擴展爲屬性e。 G。 NSString * uniqueID用於識別? – iDroid 2013-03-13 15:41:49

+0

@Inafziger:我嘗試了isEqual:,沒有幫助 – 2013-03-13 15:42:48

回答

6

如果您需要在像素平等,不指針比較圖像,你可以這樣做:

您可以創建某種哈希的每一個圖像,當您創建它。例如,所有像素值的總和(可能是模數一些巨大的數字;也許是由像素位置決定的)。

然後,將該值存儲在NSDictionary[image] = hashValue中。然後,當你比較圖像時,首先比較它們的大小,如前所述,然後,如果它們相等,則從字典中比較它們的哈希值。

如果它們相等,則圖像最可能相等,但您必須手動檢查以確保100%。

手動檢查可能需要一些時間,因此您可以通過發明自己的統計數據來降低碰撞的可能性(如不同圖像具有相同的哈希值),如更多哈希值,不同模數,散列哈希值,左上像素值(開玩笑,但誰知道......)等等。

很明顯,你有更多的統計數據,你會得到更少的衝突。 的實驗場:)

否則,只是比較喜歡這個

if(image1 == image2) { 
    ... 
} 
+0

if(image1 == image2)也不適用於我的情況,但我像一些哈希的想法 – 2013-03-13 15:47:00

+0

仍然我有同樣的問題,哈希擁抱圖像,並檢查它也將需要一些時間,所以我可以散列一些屬性或部分圖像 – 2013-03-13 15:48:21

+0

+1非常整潔的建議。 – Damo 2013-03-13 16:00:49