我試圖從文件系統比較兩個UIImage,看看它們是否相同。顯然,我不能使用NSObject的散列方法,因爲這會返回對象的散列,而不是實際的圖像數據。從UIImage生成散列
我發現代碼從一個字符串生成MD5哈希,但我還沒有發現如何實現它的UIImage。
我應該如何去散列UIImage?或者我的方法與圖像完全對比?
我試圖從文件系統比較兩個UIImage,看看它們是否相同。顯然,我不能使用NSObject的散列方法,因爲這會返回對象的散列,而不是實際的圖像數據。從UIImage生成散列
我發現代碼從一個字符串生成MD5哈希,但我還沒有發現如何實現它的UIImage。
我應該如何去散列UIImage?或者我的方法與圖像完全對比?
我使用下面的代碼完成了任務。請注意,這需要你輸入<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]
];
甲小於最優解:
[ UIImagePNGRepresentation(uiImage1) isEqualToData:
UIImagePNGRepresentation(uiImage2) ];
這基本上是2個圖像的PNG編碼數據進行比較。由於圖像相似性是一個複雜的主題,因此可以根據最終目標的具體內容設計出更好更快的解決方案(即,您是在比較圖像,逐個像素還是近似相似性,可以使用降採樣版本的源圖像等)。
所以我們應該去大致相似怎麼說高達90%similarity.I試過RGB的方法,但它是一個非常花時間的過程,當你在你的畫廊中有大約1000張圖像時,你需要相互比較。 – Imran
您的代碼是否支持JPG文件? – user2924482
是的,它將user2924482,它將文件轉換爲您將通過的uiimage的png等效數據,它是什麼類型的文件類型是無關緊要的 –
更優雅的代碼下面
+(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;
}
也許是一個愚蠢的問題,但這是否需要「我添加密碼學」檢查在App Store提交? – david
但是,我不能說所有情況下,但是,當我提交我的應用程序時,我沒有檢查該複選框。我只是使用散列來比較兩張圖片,而不是用於任何類型的數據加密。 –
對我來說,這會在每次傳球時產生不同的散列。使用[imageData bytes]作爲CC_MD5的第一個參數似乎可以解決它。 –