【问题标题】:How to compare two UIImage in iOS 8 [duplicate]如何在iOS 8中比较两个UIImage [重复]
【发布时间】:2014-10-20 13:44:51
【问题描述】:

我正在使用下面给出的方法

IBOutlet UIImageView *imgViewCheck;

- (IBAction)clkCheckUncheck:(id)sender {
    if (imgViewCheck.image == [UIImage imageNamed:@"uncheck.png"]) {
        imgViewCheck.image = [UIImage imageNamed:@"check.png"];
    } else {
        imgViewCheck.image = [UIImage imageNamed:@"uncheck.png"];
    }
}

它适用于 iOS7,但不适用于 iOS8

【问题讨论】:

  • 我不认为上面的方法可以比较 UIImage,因为这两个是不同的实例。 == 运算符仅比较两个对象的地址,如果两个对象是同一个实例,则 == 返回 true。如果需要对比图片,需要检查图片中每个字节的内容是否相同。/
  • 这通常是个坏主意,并且在 ios7 上也可能会失败。最好使用 imgViewCheck.tag 或类似的东西来存储 imageview 的状态。
  • 基本上是由This SO Answer回答的重复

标签: ios objective-c ipad uiimageview uiimage


【解决方案1】:

请比较 NSData 对象而不是比较 UIImage 对象。

-(BOOL)firstimage:(UIImage *)image1 isEqualTo:(UIImage *)image2 {
    NSData *data1 = UIImagePNGRepresentation(image1);
    NSData *data2 = UIImagePNGRepresentation(image2);

    return [data1 isEqualToData:data2];
}

【讨论】:

  • 其实用isEqualToData:而不是isEqualTo:。本质上是 This SO Answer 的副本
【解决方案2】:

我不会依赖比较图像属性和 UIImage 方法返回的地址(我想它可能是新分配的块)。

如果你真的需要比较数据(图像)是否相同,你可以使用类似的东西:

UIImage* checkImage = [UIImage imageNamed:@"check.png"];
NSData *checkImageData = UIImagePNGRepresentation(checkImage);
NSData *propertyImageData = UIImagePNGRepresentation(imgViewCheck.image);
if ([checkImageData isEqualToData:propertyImageData]) {
  //do sth
}

在可能的情况下,我希望将 state/imageId 保留在变量中以进行比较

【讨论】:

  • /* 正确的答案应该是 UIImage* checkImage = [UIImage imageNamed:@"check.png"]; NSData *checkImageData = UIImagePNGRepresentation(checkImage); NSData *propertyImageData =UIImagePNGRepresentation(self.imageview.image); if ([checkImageData isEqualToData:propertyImageData]) { //do sth }
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多