【问题标题】:UIImagePNGRepresentation() returning different bytesUIImagePNGRepresentation() 返回不同的字节
【发布时间】:2011-06-05 12:17:30
【问题描述】:

我有一些透明图像,我从文件系统加载到UIImageView 视图中。出于我的目的,我需要将UIImageView 中的图像与文件系统上的文件进行比较。所以我做了如下的事情:

NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *imageFile = [NSString stringWithFormat:@"%@/image.png", directoryPath];

if ([[NSData dataWithContentsOfFile:imageFile] isEqualToData:UIImagePNGRepresentation([imageView image])]) {
    NSLog(@"Equal");
} else {
    NSString *dataDescription = [[[NSData dataWithContentsOfFile:feltFile] description] substringToIndex:100];
    NSString *imageDescription = [[UIImagePNGRepresentation([backgroundImageView image]) description] substringToIndex:100]
    NSLog(@"Unequal: %@ %@", dataDescription, imageDescription);
}

我知道它们是 PNG 图像。当我打印它时,这两个描述都不是NULL。但它们是不平等的。

为什么会这样?

【问题讨论】:

    标签: iphone uiimage png nsdata uiimagepngrepresentation


    【解决方案1】:

    UIImagePNGRepresentation() 将通用类型无关形式的图像转换为具有标准化设置的 PNG。多个 PNG 文件可以对相同的图像进行编码,当您读入 PNG 时,您会丢失相关的元数据,然后在您写出新的 PNG 文件时重新创建(可能不同)。

    你想要完成什么?告诉我们,我们可以为您提供更好的解决方案。

    【讨论】:

    • 感谢您的回复。这就是我想要做的事情:我有一个使用 md5 散列存储的资源列表,我需要查找基于此散列选择的图像。我使用的 md5 方法需要一个 NSData 对象。因此问题是:当NSData 不等于时,哈希相应地不同,我没有找到匹配的资源。
    • 您能详细说明一下吗?仅凭这一点,您就必须重新考虑如何查找资源,因为写出新图像会占用大量资源,并且很少会给您正确的答案。
    • 谢谢乔纳森 - 我正在查找当前图像,而不是写出新图像。我认为根据您的回答和丹尼尔的回答,我将不得不将图像的哈希值存储在一个(单独的)数组中,以便我可以在其中查找。
    【解决方案2】:

    您不能指望图像的 PNG 表示形式保持逐位相同。有多种方法可以对同一张图像进行编码,并且可能还有可以在编码之间更改的元数据。

    相反,您可以逐个像素地比较图像。获取 UIImage 的像素数据如下:How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 2016-09-25
      • 2016-01-08
      • 2016-05-15
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多