4

最近我发现了一个关于 UIImageView 图像的问题。

我的意图是查找 UIImageView 是否包含图像(image.png)。

if([[self.ImgView.image isEqual:[UIImage imageNamed:@"image.png"]])
{
   NSLog(@"Image View contains image.png");//In normal run....
}else
{
  NSLog(@"Image View doesn't contains image.png");//Once came back from background
}

在正常运行中,上面的代码工作正常。

但是,当应用程序在被发送到后台后进入活动状态时,它就无法工作。

4

6 回答 6

9

Generally UIImageView can not store file name of image but it store only UIImage so, it is not possible to get file name of image which you add in UIImageView.

Thats way if you want to compare only image file name then it is not possible to compare it.

But If you want to compare two UIImage object then

UIImage *secondImage = [UIImage imageNamed:@"image.png"];

NSData *imgData1 = UIImagePNGRepresentation(self.imageView.image);
NSData *imgData2 = UIImagePNGRepresentation(secondImage);

BOOL isCompare =  [imgData1 isEqual:imgData2];
if(isCompare)
{
  NSLog(@"Image View contains image.png");
}
else
{
  NSLog(@"Image View doesn't contains image.png");
}
于 2013-10-29T06:16:09.133 回答
1

如果可以重复使用相同的图像,ios 将智能地重复使用图像并且不会创建新图像。这就是为什么您的比较有时有效的原因。这是一种糟糕的技术,不应依赖。

保留对用于生成第一张图像的字符串的引用并比较它以查看它是否包含 image.png 会更好地为您服务。

@property NSString *imageName;

然后,当您创建 UIImage 时,使用 [UIImage imageNamed:yourNameString] 您可以保存与 imageName = yourNameString 一起使用的字符串;

然后稍后,只需检查

 if ([imageName isEqualToString:@"image.png"]) {
   ...
}
于 2013-10-29T06:20:02.140 回答
1

我会使用图像来存储状态信息,你也不知道 isEqual: 是否在比较你感兴趣的内容。如果它只是使用它从 NSObject 继承的 isEqual 那么它将只比较 UIImage 地址,这可以解释你为什么有问题,也许 UIImageView 在内部使用 CGImage 或一些较低级别的对象,并根据需要创建 UIImage。

于 2013-10-29T06:21:59.613 回答
1

是的,您可以借助以下数据进行比较

    UITableViewCell *cell = (UITableViewCell*)[self.view viewWithTag:indexPath.row + 100];

    UIImage *secondImage = [UIImage imageNamed:@"boxhover.png"];

    NSData *imgData1 = UIImagePNGRepresentation(cell.imageView.image);
    NSData *imgData2 = UIImagePNGRepresentation(secondImage);

    BOOL isCompare =  [imgData1 isEqual:imgData2];
    if(isCompare)
    {
        //contain same image
        cell.imageView.image = [UIImage imageNamed:@"box.png"];
    }
    else
    {
        //does not contain same image
        cell.imageView.image = secondImage;
    }
于 2014-10-13T06:32:25.503 回答
1

尝试这个

float numDifferences = 0.0f;
float totalCompares = width * height / 100.0f;
for (int yCoord = 0; yCoord < height; yCoord += 10) {
    for (int xCoord = 0; xCoord < width; xCoord += 10) {
        int img1RGB[] = [image1 getRGBForX:xCoord andY: yCoord];
        int img2RGB[] = [image2 getRGBForX:xCoord andY: yCoord];
        if (abs(img1RGB[0] - img2RGB[0]) > 25 || abs(img1RGB[1] - img2RGB[1]) > 25 || abs(img1RGB[2] - img2RGB[2]) > 25) {
            //one or more pixel components differs by 10% or more
            numDifferences++;
        }
    }
}

if (numDifferences / totalCompares <= 0.1f) {
    //images are at least 90% identical 90% of the time
}
else {
    //images are less than 90% identical 90% of the time
}
于 2013-10-29T12:59:50.537 回答
0

您应该比较图像数据,而不是像上面提到的代码那样比较..

比较 UIImage 时要记住两件事,它们是

  1. 如果您对两个图像都使用 UIImage 和 imageName ,则可以使用 isEqual
  2. 然而,在不同的情况下,您必须使用上述方式比较图像数据。
于 2013-10-29T06:17:38.750 回答