Получить тот же NSData PHAsset после сохранения - PullRequest
0 голосов
/ 19 ноября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 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.

0 голосов
/ 21 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...