我有一个带有 ImageView 的配置文件视图,用户可以在其中更改他们的图片。我正在保存我的新旧图像以进行比较。我想知道它们是否相同,所以如果是,我不需要将新的推送到我的服务器。
我尝试了这个,但它并没有真正起作用:
+ (NSData*)returnImageAsData:(UIImage *)anImage {
// Get an NSData representation of our images. We use JPEG for the larger image
// for better compression and PNG for the thumbnail to keep the corner radius transparency
float i_width = 400.0f;
float oldWidth = anImage.size.width;
float scaleFactor = i_width / oldWidth;
float newHeight = anImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[anImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(newImage, 0.5f);
return imageData;
}
+ (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
NSData *data1 = [self returnImageAsData:image1];
NSData *data2 = [self returnImageAsData:image2];
return [data1 isEqual:data2];
}
知道如何检查两个图像是否相同吗?
最终结果:
+ (NSData*)returnImageAsData:(UIImage *)anImage {
// Get an NSData representation of our images. We use JPEG for the larger image
// for better compression and PNG for the thumbnail to keep the corner radius transparency
// float i_width = 400.0f;
// float oldWidth = anImage.size.width;
// float scaleFactor = i_width / oldWidth;
//
// float newHeight = anImage.size.height * scaleFactor;
// float newWidth = oldWidth * scaleFactor;
//
// UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
// [anImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
// UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(anImage, 0.5f);
return imageData;
}
+ (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
CGSize size1 = image1.size;
CGSize size2 = image2.size;
if (CGSizeEqualToSize(size1, size2)) {
return YES;
}
NSData *data1 = UIImagePNGRepresentation(image1);
NSData *data2 = UIImagePNGRepresentation(image2);
return [data1 isEqual:data2];
}
如果您想查看两张图像的像素是否相同,那应该很容易。
将图像保存为 JPEG 可能会导致问题,因为 JPEG 是一种有损格式。
正如其他人所建议的,首先确保两个图像的高度和宽度匹配。如果没有,就停下来。图像不同。
如果匹配,请使用 UIImagePNGRepresentation() 等函数将图像转换为无损数据格式。然后对您返回的 NSData 对象使用 isEqual 。
如果您想检查图像是否看起来相同(例如同一场景的两张照片),那么您面临的问题要困难得多。您可能需要借助 OpenCV 等软件包来比较图像。
编辑:我不知道 UIImage 是否有 isEqual 的自定义实现,您可以使用它来比较两个图像。我会先尝试一下。
查看文档,UIImage 也符合 NSCoding,因此您可以使用 archivedDataWithRootObject 将图像转换为数据。这可能比 PNG 编码更快。
最后,您可以获得指向图像底层 CGImage 对象的指针,获取它们的数据提供者,并以这种方式比较它们的字节流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)