我有一个问题,即当一个图像已经使用NSSearchPathForDirectoriesInDomains方法进行保存和加载过程时,比较Objective-C中的UIImages。
我想要的目的是根据图像显示的内容,在点击时将用户引导到新的屏幕。
为简单起见,我们假设有两种可能性 - 黑色图像和绿色图像。单击黑色图像将转到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为sender的按钮后调用以下代码(这是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>
我无法弄清楚如何比较这两个图像,以便在这种情况下它们匹配(它们都与我在资源文件夹中的相同图像有关)。有人有任何建议吗?
如果我没有充分解释问题是什么,请告诉我。
提前致谢!
答案 0 :(得分:25)
如果图像名称或图像URL是从Internet下载的,它可以比较它,它也会比比较图像更快。
此外,问题是通过使用==运算符,您正在比较图像0x95614c0和0xde748f0的内存地址。这就是为什么不平等。您正在比较它们是否是同一个对象,而不是图像是否相等。
比较图像使用:正如Fls'Zen回答中提到的那样。
if ([UIImagePNGRepresentation(blackImage) isEqualToData:UIImagePNGRepresentation(greenImage)])
答案 1 :(得分:4)
您的图片肯定有不同的地址,因为一个从您的应用程序包加载,一个从文档目录加载。 [UIImage imageNamed:]函数仅返回应用程序包中的图像。
如果您真的想按内容比较图片,请查看this问题。在第一个答案中,为图像计算散列值s。在您的代码中,您可以比较您拥有的两个图像的哈希值。第二个答案直接比较图像,以防哈希让你紧张。
我建议您使用不同的路线,并让您的应用程序跟踪图像本身外部加载的图像。