9

1 つの画像が NSSearchPathForDirectoriesInDomains メソッドを使用して保存および読み込みプロセスを既に完了している場合に、Objective-C で UIImages を比較することについて質問があります。

私が望むのは、画像の表示内容に応じて、クリック時にユーザーを新しい画面に誘導することです。

簡単にするために、黒のイメージと緑のイメージの 2 つの可能性があるとします。黒い画像をクリックすると xib1 に移動し、緑色の画像をクリックすると xib2 に移動します。

これは非常に簡単で、保存および読み込みシステムを実装するまで機能していました。

保存するには、次のようにします。

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory];
data1 = [NSData dataWithData:UIImagePNGRepresentation([level1part1 objectAtIndex:0])];
[data1 writeToFile:pngFilePath atomically:YES];

ロードするには、次のようにします。

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory];
UIImage *image = [UIImage imageWithContentsOfFile:pngFilePath];
[button1 setImage:image forState:UIControlStateNormal];

これで問題ありません。プログラムを終了して再起動すると、希望どおりに画像が画面に表示されます。仮説として、現在 button1 に表示されている画像が緑色の画像であるとしましょう。

送信者のIDを持つボタンをクリックした後に次のコードを呼び出すと(これはbutton1です):

if(sender.currentImage == [UIImage imageNamed:self.greenImage])
{
    VisitAlreadyCorrectScreen *screen = [[VisitAlreadyCorrectScreen alloc] initWithNibName:nil bundle:nil];
    screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:screen animated:YES];
}

currentImage は緑色の画像であり、比較している緑色の画像と同じ画像ですが、保存プロセスで緑色の画像をメモリに保存したため、異なる場所に保持されているため比較が機能しないと思いますメモリ内 - 次の NSLog で検証:

Current Image: <UIImage: 0x95614c0>, and Yes Image: <UIImage: 0xde748f0>

この場合、2 つの画像を比較して一致させる方法がわかりません (どちらもリソース フォルダーにある同じ画像に関連しています)。誰にも提案はありますか?

問題が何であるかを十分に説明していない場合はお知らせください。

前もって感謝します!

4

2 に答える 2

26

インターネットからダウンロードした場合は、画像名や画像のURLを比較できます。また、画像を比較するよりも高速です。

また、問題は、==演算子を使用して、イメージ0x95614c0と0xde748f0のメモリアドレスを比較していることです。それが等しくない理由です。画像が等しい場合ではなく、それらが同じオブジェクトであるかどうかを比較しています。

画像を比較するには、次のように使用します。Fls'Zenの回答で述べたように。

if ([UIImagePNGRepresentation(blackImage) isEqualToData:UIImagePNGRepresentation(greenImage)])
于 2012-06-26T21:50:16.760 に答える
4

1つはアプリケーションバンドルからロードされ、もう1つはドキュメントディレクトリからロードされるため、画像のアドレスは確かに異なります。[UIImage imageNamed:]関数は、アプリケーションバンドルからの画像のみを返します。

本当に内容ごとに画像を比較したい場合は、このSOの質問をチェックしてください。最初の答えでは、画像に対してハッシュ値が計算されます。あなたのコードでは、あなたが持っている2つの画像のハッシュ値を比較することができます。2番目の答えは、ハッシュによって緊張する場合に備えて、画像を直接比較します。

別のルートを使用して、画像自体の外部に読み込まれる画像をアプリケーションで追跡することをお勧めします。

于 2012-06-26T21:57:48.920 に答える