我试图从文件系统比较两个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的第一个参数似乎可以解决它。 –