【问题标题】:Get the same NSData of PHAsset after save保存后获取与PHAsset相同的NSData
【发布时间】:2018-11-19 11:58:34
【问题描述】:

您知道在使用PHPhotoLibrary 保存后是否有任何方法可以获取相同的图像 NSData(JPG、PNG)?

OfC,iOS 将在保存后修改一些元数据和EXIF-->(时间戳,...)数据,但是,我询问的是 UIImage 数据(包括相同的 EXIF 数据)。 我没有在我的代码中复制 exif,但它不起作用 所以让我们谈谈代码:

保存图片并获取哈希

 UIImage * tmp = [[UIImage alloc] initWithData:tmpData];
 tmpData =UIImageJPEGRepresentation(tmp, 1.0);
 self.str1 =  [tmpData MD5];                
 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
 PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
 options.originalFilename = @"XXX";
 PHAssetCreationRequest * createReq   =   [PHAssetCreationRequest creationRequestForAsset];
[createReq  addResourceWithType:PHAssetResourceTypePhoto data:tmpData options:options];
            } completionHandler:^(BOOL success, NSError * _Nullable error) {
    NSLog(@":%d",success);
 }];

加载相同的图像:

[asset requestContentEditingInputWithOptions:0 completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput,  NSDictionary * _Nonnull info) {
 PHImageRequestOptions * option = [[PHImageRequestOptions alloc] init];
 option.synchronous = YES;
 option.version = PHImageRequestOptionsVersionOriginal;
 option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
 option.resizeMode = PHImageRequestOptionsResizeModeNone;
 [[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {


 UIImage * image = [UIImage imageWithData:imageData];
 NSData * tmpDAt =  UIImageJPEGRepresentation(image, 1.0);           
 NSString * md5 =  [tmpDAt MD5];
 if ([md5 isEqualToString:self.str1]) {
  NSLog(@"My Expextation");
  }   
}];

我发现有趣的是,如果我将图像裁剪为1*1 进行测试,我会在保存过程中收到一些错误(JPEGDecompressSurface : Picture decode failed:)(似乎操作系统无法修改图像)所以我之前得到了相同的哈希值保存后:)!

【问题讨论】:

    标签: ios objective-c phasset phphotolibrary


    【解决方案1】:

    我认为差异是由于您的 JPEG 在其 EXIF 元数据中具有不同的时间戳(可能还有其他差异)。

    您是否尝试过使用UIImagePNGRepresentation 而不是UIImageJPEGRepresentation?希望 PNG 表示会匹配。

    【讨论】:

    • 我也在考虑这个问题,但是如果我为新图像复制所有 EXIF 数据怎么办? (JPEG)
    • 另外,我也尝试使用UIImagePNGRepresentation,因为您知道 PNG 不会保持方向,所以我检查了所有方向的 md5 结果,并且与原始结果不匹配。我认为它可能与时间戳和......但不确定,因为我正在复制新图像的所有 EXIF 信息
    【解决方案2】:

    Jpeg 压缩是一种有损压缩形式。每次转换为 Jpeg 时都会丢失数据。没有其他办法了。从方程中删除 PHPhotoLibrary。如果你运行以下

    UIImage * tmp = [[UIImage alloc] initWithData:tmpData];
    tmpData =UIImageJPEGRepresentation(tmp, 1.0);
    str1 =  [tmpData MD5];
    tmp = [[UIImage alloc] initWithData:tmpData];
    tmpData =UIImageJPEGRepresentation(tmp, 1.0);
    str2 =  [tmpData MD5];
    

    你会发现str1和str2是不一样的。

    如果您想要相同的数据,则必须保留生成图像的原始 jpeg 数据或使用无损压缩方法,如 PNG 文件中使用的方法。

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2018-01-06
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多