Objective-C:将图像与先前保存的另一个图像进行比较



我有一个关于比较 Objective-C 中的 UIImages 的问题,当一个图像已经使用 NSSearchPathForDirectoryInDomains 方法经过保存和加载过程时。

我想要的目的是根据图像显示的内容,在单击时将用户定向到新屏幕。

为简单起见,假设有两种可能性 - 黑色图像和绿色图像。单击黑色图像将转到 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 的按钮(这是按钮 1)后调用以下代码时:

if(sender.currentImage == [UIImage imageNamed:self.greenImage])
{
    VisitAlreadyCorrectScreen *screen = [[VisitAlreadyCorrectScreen alloc] initWithNibName:nil bundle:nil];
    screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:screen animated:YES];
}
即使当前图像是绿色图像

并且与我正在比较的绿色图像是相同的图片,我认为因为我在保存过程中将绿色图像保存到内存中,因此比较不起作用,因为它们保存在内存中的不同位置 - 由以下 NSLog 验证:

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

我无法弄清楚如何比较两个图像,以便在这种情况下它们匹配(它们都与我在资源文件夹中的同一图像相关)。有人有任何建议吗?

如果我没有很好地解释问题所在,请告诉我!

提前感谢!

如果图片是从互联网下载的,您可以比较图片名称或图片网址,这也比比较图片更快。

此外,问题在于通过使用 == 运算符,您可以比较图像0x95614c0和0xde748f0的内存地址。这就是为什么不平等。您正在比较它们是否是同一对象,而不是图像是否相等。

要比较图像,请使用:如Fls'Zen答案中所述。

if ([UIImagePNGRepresentation(blackImage) isEqualToData:UIImagePNGRepresentation(greenImage)])

您的图像肯定有不同的地址,因为一个是从应用程序包加载的,另一个是从文档目录加载的。[UIImage imageNamed:] 函数仅从应用程序捆绑包返回图像。

如果您真的想按内容比较图像,请查看此SO问题。在第一个答案中,为图像计算哈希值。在代码中,可以比较拥有的两个图像的哈希值。第二个答案直接比较图像,以防哈希值让您感到紧张。

我建议采用不同的路线,让您的应用程序跟踪在图像本身之外加载的图像。

相关内容

  • 没有找到相关文章

最新更新