Фотография с низким разрешением в фотопленке при сохранении с помощью платформы Photos

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:saveImage]; 
    if (_collection) {
        PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:_collection];
        [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];
    }
} completionHandler:^(BOOL success, NSError *error) {
    if (!success)
    {
        NSLog(@"Error creating asset: %@", error);
    }
}];

Я использую приведенный выше код и получаю странное фото в фотопленке, похожее на фото 1. введите здесь описание изображения

но когда я открываю сохраненную фотографию с помощью VSCO или snapseed, я могу получить обычную версию, которая была той, которую я сохранил.

Является ли это ошибкой Apple Camera Roll?

введите здесь описание изображения

Очень странно, что это выглядит хорошо. Если я сохраняю входные данные непосредственно в библиотеку фотографий, но после добавления метаданных фотография в системном приложении для фотографий выглядит нечеткой.

-(NSData*)getDataOfImage:(UIImage *)image
                 metaData:(NSDictionary *)metaData
{
    NSData *inputData = UIImageJPEGRepresentation(image,1.0);

    CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef) inputData,nil);
    NSMutableData *outputData = [NSMutableData new];
    CFStringRef UTI = CGImageSourceGetType(imageSource);
    CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef) outputData, UTI, 1, NULL);
    CGImageDestinationAddImageFromSource (imageDestination, imageSource, 0, (__bridge CFMutableDictionaryRef)metaData);
    BOOL result = CGImageDestinationFinalize(imageDestination);
    if (result == YES) {
        NSLog(@"success: save MetaData");
    }else{
        NSLog(@"failed :save MetaData ");
    }
    CFRelease(imageSource);
    CFRelease(UTI);
    CFRelease(imageDestination);
    return outputData;
}

person Dikey    schedule 24.07.2015    source источник


Ответы (2)


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
//NSString *temporaryPath = [cachesDir stringByAppendingString:@"temp"];
NSString *temporaryPath = [cachesDir stringByAppendingString:@"temp.jpg"];

Очень странно... после добавления типа расширения его разрешение становится нормальным при сохранении с помощью photos.framework PHAssetChangeRequest. Кажется, тип расширения по умолчанию для сохранения - PNG ... не JPG ...

person Dikey    schedule 28.07.2015

По умолчанию PHPhotoLibrary сохраняет изображение в формате jpeg с коэффициентом сжатия 0,8. Для лучшего качества создайте образ самостоятельно (например, с коэффициентом 0,95) и используйте createRequestForAssetFromImage(atFileURL:) вместо createRequestForAsset(from:).

person Igor    schedule 14.09.2020
comment
Я не могу воспроизвести это. Это где-нибудь задокументировано? - person joelfischerr; 24.02.2021
comment
Что вы не можете воспроизвести? Я думаю, что это не задокументировано, я нашел это экспериментально, и это работает для меня. - person Igor; 24.02.2021