2009-11-06 104 views
20

我試圖從文件系統比較兩個UIImage,看看它們是否相同。顯然,我不能使用NSObject的散列方法,因爲這會返回對象的散列,而不是實際的圖像數據。從UIImage生成散列

我發現代碼從一個字符串生成MD5哈希,但我還沒有發現如何實現它的UIImage。

我應該如何去散列UIImage?或者我的方法與圖像完全對比?

回答

35

我使用下面的代碼完成了任務。請注意,這需要你輸入<CommonCrypto/CommonDigest.h>

unsigned char result[CC_MD5_DIGEST_LENGTH]; 
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(inImage)]; 
CC_MD5([imageData bytes], [imageData length], result); 
NSString *imageHash = [NSString stringWithFormat: 
         @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
         result[0], result[1], result[2], result[3], 
         result[4], result[5], result[6], result[7], 
         result[8], result[9], result[10], result[11], 
         result[12], result[13], result[14], result[15] 
         ]; 
+4

也許是一個愚蠢的問題,但這是否需要「我添加密碼學」檢查在App Store提交? – david

+0

但是,我不能說所有情況下,但是,當我提交我的應用程序時,我沒有檢查該複選框。我只是使用散列來比較兩張圖片,而不是用於任何類型的數據加密。 –

+1

對我來說,這會在每次傳球時產生不同的散列。使用[imageData bytes]作爲CC_MD5的第一個參數似乎可以解決它。 –

7

甲小於最優解:

[ UIImagePNGRepresentation(uiImage1) isEqualToData: 
     UIImagePNGRepresentation(uiImage2) ]; 

這基本上是2個圖像的PNG編碼數據進行比較。由於圖像相似性是一個複雜的主題,因此可以根據最終目標的具體內容設計出更好更快的解決方案(即,您是在比較圖像,逐個像素還是近似相似性,可以使用降採樣版本的源圖像等)。

+0

所以我們應該去大致相似怎麼說高達90%similarity.I試過RGB的方法,但它是一個非常花時間的過程,當你在你的畫廊中有大約1000張圖像時,你需要相互比較。 – Imran

+0

您的代碼是否支持JPG文件? – user2924482

+0

是的,它將user2924482,它將文件轉換爲您將通過的uiimage的png等效數據,它是什麼類型的文件類型是無關緊要的 –

1

更優雅的代碼下面

+(NSString *)MD5HexDigest:(NSData *)input { 
 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
 

 
    CC_MD5(input.bytes, (unsigned int)input.length, result); 
 
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 
 
    for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) { 
 
     [ret appendFormat:@"%02x",result[i]]; 
 
    } 
 
    return ret; 
 
}