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

通常UIImageViewは画像のファイル名を保存することはできませんが、保存するだけUIImageなので、追加した画像のファイル名を取得することはできませんUIImageView

そのため、画像ファイル名だけを比較したい場合は比較できません。

UIImageしかし、2つのオブジェクトを比較したい場合は

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

isEqual: が興味のあるものを比較しているかどうかもわかりません。 NSObject から継承した isEqual を使用しているだけの場合は、UIImage アドレスだけを比較します。問題が発生した場合、おそらく UIImageView は内部で CGImage または下位レベルのオブジェクトを使用しており、必要に応じて UIImage を作成しています。

于 2013-10-29T06:21:59.613 に答える
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 に答える
1

iOS は、同じイメージを再利用できる場合、イメージをインテリジェントに再利用し、新しいイメージを作成しません。それがあなたの比較が時々うまくいく理由です。これは悪い手法であり、信頼すべきではありません。

最初の画像を生成するために使用された文字列への参照を保持し、それを比較して image.png が含まれているかどうかを確認することをお勧めします。

@property NSString *imageName;

次に、UIImage を作成するときに、[UIImage imageNamed:yourNameString] を使用して、imageName = yourNameString; で使用される文字列を保存できます。

後はチェックするだけ

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

上記のコードのように比較するのではなく、画像データを比較する必要があります..

UIImage を比較する際に留意すべき点が 2 つあります。

  1. 両方の画像にimageNameでUIImageを使用している場合は、isEqualを使用できます
  2. 一方、別のケースでは、代わりに上記の方法を使用して画像データを比較する必要があります..
于 2013-10-29T06:17:38.750 に答える