将生成的GIF保存到相机胶卷?

10

感谢阅读。我使用这个问题中的方法创建了一个 GIF:

如何通过 iOS 创建和导出动态 gif?

我尝试使用唯一似乎能保存非 JPG/PNG 图像到相册的方法,即 ALAssetLibrarywriteImageDataToSavedPhotosAlbum:metadata:completionBlock:

我将 GIF 保存到临时目录中,方法如下:

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

然后像这样访问NSData

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

尽管我能够在UIImageView中显示GIF,但是当我尝试保存它时,该方法返回成功(没有错误),但实际上并没有保存(对于NSURL * assetURL返回Nil并且在照片库中也看不到)。

我该如何使我的GIF成功保存到照片库中?


添加了两个解决方案。第一个只是将现有的 GIF 保存到相机胶卷中。第二个使用库(http://jitsik.com/wordpress/?p=208)创建并将 GIF 保存到相机胶卷中。请检查我的 GIT 分支。 - bllakjakk
4个回答

11

**

解决方案01:仅将现有的GIF文件保存到相机胶卷

**

据我理解,您可以生成一个GIF文件,但无法将其保存并查看到相机胶卷。

因此,我附上了一个使用现有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:现在我将文件保存在媒体目录中:

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

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

Asset URL正确,现在您可以检查媒体目录并定位已保存的GIF图像。

玩得开心:)


**

解决方案02:创建和保存GIF到相机胶卷的演示

我克隆了一些解决方案来展示如何创建和保存GIF文件到相机胶卷。 您可以下载并查看我的Github分支:

该演示通过拍摄2个或多个图像创建GIF文件,并将其保存在相机胶卷目录中。

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


如果您能向我展示如何使用此功能保存到相机胶卷,我将创建一个赏金。 - Rob Caraway
虽然我已经自己找到了一个解决方案,但如果我不能将GIF的大小缩小到足以避免在较大文件上崩溃,我可能会采取这种方式。 - Rob Caraway
ALAssetsLibrary已经被弃用 - 是否有更新的版本? - ina

2

我发现问题在于我无法从文件中获取GIF。我改用了CGImageDestinationCreateWithData而不是CGImageDestinationCreateWithURL,并使用CFMutableDataRef来保存Gif数据。我不知道为什么,但这使得使用writeImageDataToSavedPhotosAlbum保存到相机胶卷的功能可以工作。


1
这个是否已经更新以适用于iOS 9,以及ALAssets的弃用?我在PHPhotoLibrary中没有看到类似的调用。

1
这怎么是一个答案? - David Seek

0

这里是使用PHPhotoLibrary更新的答案,因为ALAssetsLibrary已被弃用。

我使用了另一位用户-陈星旺的答案

PHPhotoLibrary保存gif数据

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

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

    PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
    [[PHAssetCreationRequest creationRequestForAsset]
     addResourceWithType:PHAssetResourceTypePhoto
     data:gifData
     options:options];

} completionHandler:^(BOOL success, NSError * _Nullable error) {

    if (success) {
        NSLog(@"image saved!");
    } else {
        NSLog(@"error saving image - %@", error ? error.localizedDescription : @"");
    }
}];

如果您需要从URL下载GIF数据,可以使用以下代码:
NSData *gifData = [NSData dataWithContentsOfURL:theGIFsURL];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接