Доступ к обрезанным или отредактированным изображениям с помощью ALAssetsLibrary - PullRequest
9 голосов
/ 07 января 2012

У меня есть приложение ipad, которое берет изображения из приложения Photos с помощью ALAssetsLibrary и затем загружает их на веб-сервер.Пока все работает нормально.

Теперь, если я зайду в приложение для фотографий, отредактирую изображение (скажем, обрежу) и загрузлю, загруженный оригинал будет загружен.Я открываю / сохраняю фотографию, используя URL ресурса.

Пример:

createPhoto: 
assetUrl: assets-library://asset/asset.JPG?id=542F09CA-00E1-412E-A7E6-0C222E3F8FFB&ext=JPG, 
UTIs: (
    "public.jpeg"
), 
UTI:public.jpeg

Это не проблема ALAssetsLibrary кеша, потому что я попытался отредактировать, убить приложение, запустить, загрузка, которая все еще загружает старое изображение.

Вопрос:

  1. Как я могу узнать, доступна ли отредактированная (обрезанная / с эффектом красных глаз / улучшенная) версия фотографии?
  2. Как получить доступ к отредактированной версии фотографии?

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Я узнал то же поведение и некоторое время назад проводил тестирование.Позвольте мне поделиться с вами своими результатами:

  1. Отредактированное изображение, которое вы получаете только методом fullScreenImage.Это также упоминается в документации Apple: «В iOS 5 и более поздних версиях этот метод возвращает полностью обрезанное, повернутое и скорректированное изображение - в точности так, как пользователь будет видеть в Фото или в средстве выбора изображений».

  2. Метод fullResolutionImage и getBytes возвращают неотредактированное изображение.Однако параметры редактирования, такие как обрезка, сохраняются в метаданных изображения.Однако эта информация метаданных интерпретируется только приложениями Apple, такими как Aperture и iPhoto.

  3. Вы можете узнать, было ли изображение отредактировано, проверив метаданные изображения.Сравните метаданные неотредактированного и отредактированного изображения и найдите различия в полях метаданных.

1 голос
/ 30 января 2015
-(UIImage*)fullScreenImage:(ALAsset *)imageAsset{
    ALAssetRepresentation *assetRepresentation = [imageAsset defaultRepresentation];
    CGImageRef fullResImage = [assetRepresentation fullResolutionImage];
    NSString *adjustment = [[assetRepresentation metadata] objectForKey:@"AdjustmentXMP"];
    if (adjustment) {
        NSData *xmpData = [adjustment dataUsingEncoding:NSUTF8StringEncoding];
        CIImage *image = [CIImage imageWithCGImage:fullResImage];

        NSError *error = nil;
        NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData
                                                     inputImageExtent:image.extent
                                                                error:&error];
        CIContext *context = [CIContext contextWithOptions:nil];
        if (filterArray && !error) {
            for (CIFilter *filter in filterArray) {
                [filter setValue:image forKey:kCIInputImageKey];
                image = [filter outputImage];
            }
            fullResImage = [context createCGImage:image fromRect:[image extent]];
        }
    }
    UIImage *result = [UIImage imageWithCGImage:fullResImage
                                          scale:[assetRepresentation scale]
                                    orientation:(UIImageOrientation)[assetRepresentation orientation]];
    return result;
}

В приведенной выше функции передайте значение ALAsset, а затем отредактированное изображение ...:)

Над кодом для получения отредактированного изображения из метаданных

Если вы идете с полноэкранным изображением, то вы также получите отредактированное изображение

ALAssetRepresentation *representation = [asset defaultRepresentation];
 CGImageRef iref = [representation fullScreenImage];
 UIImage *editedImage = [UIImage imageWithCGImage:iref];
...