首页 > 解决方案 > 保存后获取与PHAsset相同的NSData

问题描述

你知道有没有办法在保存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:在保存过程中收到一些错误(

标签: iosobjective-cphassetphphotolibrary

解决方案


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

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


推荐阅读