Сохранить сгенерированный 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.