Получите те же NSData PHAsset после сохранения

Знаете ли вы, есть ли способ получить те же NSData изображения (JPG, PNG) после сохранения с PHPhotoLibrary или нет?

OfC, iOS изменит некоторые метаданные и EXIF-- > ( Timestamp,... ) данные после сохранения, но я спрашиваю о данных 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: ) во время сохранения (похоже, ОС не может изменить изображение), поэтому я получаю один и тот же хэш до и после сохранения :)!


person Mo Farhand    schedule 19.11.2018    source источник


Ответы (2)


Я предполагаю, что разница связана с тем, что ваши файлы JPEG имеют разные временные метки (и, возможно, другие различия) в своих метаданных EXIF.

Вы пробовали использовать UIImagePNGRepresentation вместо UIImageJPEGRepresentation? Надеюсь, представления PNG будут совпадать.

person Clafou    schedule 21.11.2018
comment
Я тоже об этом думал, но что, если я скопирую все данные EXIF ​​для нового изображения? (JPEG) - person Mo Farhand; 21.11.2018
comment
Кроме того, я пробовал с UIImagePNGRepresentation, как вы знаете, PNG не сохраняет ориентацию, поэтому я проверяю результаты md5 во всех направлениях и не совпадают с исходным. Я думаю, что это может быть связано с отметкой времени и... но не уверен, так как копирую всю информацию EXIF ​​для нового изображения. - person Mo Farhand; 21.11.2018

Сжатие 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.

person adamfowlerphoto    schedule 11.12.2018