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

问题描述 投票:10回答:4

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

Create and and export an animated gif via iOS?

我试图使用似乎能够将非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];

创建GIF因为我能够在UIImageView中显示它,但是当我尝试保存它时,该方法返回成功(没有错误)但实际上没有保存(为Nil返回NSURL * assetURL并且不会出现在相机卷)。

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

ios objective-c xcode gif alassetslibrary
4个回答
11
投票

**

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

**

据我了解你的问题。您可以生成GIF文件但无法保存并将其查看到相机胶卷。

所以我使用现有的GIF文件附加了一个示例测试。

步骤01.我在我的Application Document目录中复制了一个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文件到相机胶卷。你可以在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


2
投票

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


1
投票

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


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];
© www.soinside.com 2019 - 2024. All rights reserved.