Сохранить сгенерированный GIF в кадре камеры?

Спасибо за чтение. Я создал GIF, используя методы из этого вопроса:

Создать и экспортировать анимированный gif через iOS?

Я пытаюсь использовать единственный метод, который, по-видимому, способен сохранять изображения без JPG/PNG в рулоне камеры, ALAssetLibrary writeImageDataToSavedPhotosAlbum:metadata:completionBlock:

Я сохраняю Gif для временного каталога следующим образом:

NSString *exportPath = [NSTemporaryDirectory() stringByAppendingString:@"/animated.gif"];
NSURL *fileURL = [NSURL fileURLWithPath:exportPath isDirectory:NO];

Затем войдите в NSData как:

NSData * gifData = [NSData dataWithContentsOfFile:fileURL.absoluteString];

GIF создается, так как я могу отображать его в UIImageView, но когда я пытаюсь его сохранить, метод возвращает успех (без ошибок), но фактически не сохраняет (возвращает Nil для NSURL * assetURL и не отображается в рулоне камеры).

Как я могу получить GIF файлы для успешного сохранения в кадре камеры?

Ответ 1

Я обнаружил, что проблема в том, что я не смог на самом деле захватить GIF из файла. Я переключился с CGImageDestinationCreateWithURL на CGImageDestinationCreateWithData и использовал CFMutableDataRef для хранения данных Gif. Я не знаю, почему, но это сделало сохранение в камере с помощью writeImageDataToSavedPhotosAlbum.

Ответ 2

**

Решение 01: сохранение только существующего файла GIF в Camera Roll

**

Как я понимаю вашу проблему. Вы можете сгенерировать GIF файл, но не можете сохранить его, а также просмотреть его в Camera Roll.

Итак, я прикрепляю образец теста с использованием существующего файла GIF.

Шаг 01. Я скопировал gif файл IMG_0009.GIF в каталог своего документа приложения.

Шаг 02 Чем я пользуюсь приведенным ниже кодом для загрузки этих файлов NSData:

NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"IMG_0009.gif"];

NSData *gifData = [NSData dataWithContentsOfFile:[fileURL path]];

Шаг 03: Теперь я сохраняю файл в Media Directory:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageDataToSavedPhotosAlbum:gifData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {

    NSLog(@"Success at %@", [assetURL path] );
}];

Правильный URL-адрес. Теперь вы можете проверить свой медиа-каталог. вы можете найти сохраненное изображение gif.

Удачи:)


**

Решение 02: Демонстрация создания и сохранения GIF в рулоне камеры

**

Я клонировал некоторое решение, чтобы показать создание и сохранение GIF файлов в Camera Roll. Вы можете скачать и проверить свою вилку в github:

Демонстрация создает GIF файл, принимая 2 или более изображений и сохраняя в каталоге Camera Roll

https://github.com/bllakjakk/Giraffe

Основной код для фокусировки выглядит следующим образом:

[export encodeToFile:tempFile callback:^(NSString * aFile) {

    NSLog(@"Path: %@", aFile);

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

    NSData *data = [NSData dataWithContentsOfURL:[[NSURL alloc]initFileURLWithPath:aFile]];

    [library writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {

        NSLog(@"Success at %@", [assetURL path] );
    }];

}];

Он использует библиотеку, как я упоминал в своем решении, прежде чем http://jitsik.com/wordpress/?p=208

Как проверить:

Шаг 01: Запустите демонстрационный проект.

Шаг 02:. По указанию приложения добавьте 2 изображения и нажмите "Экспорт".

Шаг 03: Теперь проверьте рулон камеры, вы найдете созданный gif.

Предыдущий:

GIF - это собственный формат, поэтому для его сохранения потребуется сторонняя библиотека.

проверьте следующую ссылку: http://jitsik.com/wordpress/?p=208

Ответ 3

Обновлено ли это для работы с iOS 9 и устаревшей ALAssets? Я не вижу подобных вызовов в PHPhotoLibrary.