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

时间:2014-10-10 13:49:36

标签: ios objective-c xcode gif alassetslibrary

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

Create and and export an animated gif via iOS?

我正在尝试使用看似能够将非JPG / PNG图像保存到相机胶卷的唯一方法ALAssetLibrary的{​​{1}}

我将Gif保存到临时目录中,如下所示:

writeImageDataToSavedPhotosAlbum:metadata:completionBlock:

然后访问NSString *exportPath = [NSTemporaryDirectory() stringByAppendingString:@"/animated.gif"]; NSURL *fileURL = [NSURL fileURLWithPath:exportPath isDirectory:NO]; ,如:

NSData

创建GIF是因为我能够在NSData * gifData = [NSData dataWithContentsOfFile:fileURL.absoluteString]; 中显示它,但是当我尝试保存它时,该方法返回成功(没有错误)但实际上没有保存(返回{ {1}} UIImageView并且未出现在相机胶卷中。

如何让我的GIF成功保存到相机胶卷?

4 个答案:

答案 0 :(得分: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] );
}];

资产网址是正确的。现在您可以查看媒体目录。你可以找到保存的gif图像。

玩得开心:)


**

  

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

**

我克隆了一些解决方案,以显示创建和保存GIF文件到Camera Roll。 你可以在github上下载并查看我的fork:

该演示通过拍摄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

答案 1 :(得分:2)

我发现问题是我无法从文件中抓取GIF。我从使用CGImageDestinationCreateWithURL切换到CGImageDestinationCreateWithData并使用CFMutableDataRef来保存Gif数据。我不知道为什么,但是通过writeImageDataToSavedPhotosAlbum工作来保存到相机。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

PHPhotoLibrary save a gif data

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];