Save generated GIF to camera roll?

梦想的初衷 提交于 2019-12-04 02:06:19

**

Solution 01 : Only saving the existing GIF file to Camera Roll

**

As I understand your problem. You are able to generate a GIF file but cannot save and also view it to the Camera Roll.

So I am attaching a sample test using existing GIF File.

Step 01. I copied a gif IMG_0009.GIF file in my Application Document directory.

Step 02 Than I use the below code to load this files 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]];

Step 03: Now I save the file in the Media Directory:

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

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

The Asset URL is proper. Now you can check you media directory. you can locate the saved gif image.

Have Fun :)


**

Solution 02: Demo of Creating and saving GIF to Camera roll

**

I cloned some solution to show creating and saving of GIF files to Camera Roll. You can download and check my fork at github:

The demo creates a GIF file by taking 2 or more images and save in the Camera Roll Directory

https://github.com/bllakjakk/Giraffe

The main Code to focus is like below:

[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] );
    }];

}];

It uses the library as I mentioned in my solution before http://jitsik.com/wordpress/?p=208

How to verify:

Step 01: Run the demo project.

Step 02: As directed by the application add 2 images and click Export.

Step 03: Now check the camera roll you will find the created gif.

Previous:

GIF is a proprietary format, so you would need a 3rd party lib to save it.

check following link: http://jitsik.com/wordpress/?p=208

I found the issue was that I was unable to actually grab the GIF from the file. I switched from using CGImageDestinationCreateWithURL to CGImageDestinationCreateWithData and used a CFMutableDataRef to hold the Gif data. I don't know why, but that made saving to camera roll with writeImageDataToSavedPhotosAlbum work.

Has this been updated to work with iOS 9, and the deprecation of ALAssets? I do not see similar calls in PHPhotoLibrary.

Here is an updated answer using PHPhotoLibrary, since ALAssetsLibrary is deprecated.

I used this answer from another user - 陈星旺

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 : @"");
    }
}];

If you needed to download the GIF data from a URL, you could use this:

NSData *gifData = [NSData dataWithContentsOfURL:theGIFsURL];
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!