2009-11-06 69 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; 
 
}