Guardar file gif creado de capturas de pantalla a rollo de camera

Tengo un gif en la carpeta de documentos. Me gustaría que los usuarios de la aplicación puedan acceder y enviar correos electrónicos para usar en otras plataforms que admiten la animation de gif.

Generé el file gif usando información de esta publicación …

¿Crear y exportar un gif animado a través de iOS?

El file gif generado y animado correctamente (abierto directamente desde la carpeta de documentos del simulador en safari)

Lamentablemente, al intentar mover el file al rollo de la camera (para un correo electrónico fácil para el usuario) utilizando UIImageWriteToSavedPhotosAlbum o writeImageDataToSavedPhotosAlbum de ALAssetsLibrary, la image parece convertirse en un file jpg y pierde toda la animation.

Comprobé esto enviando un file por correo electrónico desde el rollo de la camera y abriéndolo en una plataforma diferente (la funcionalidad que me gustaría que tuvieran los usuarios).

He leído todas las publicaciones que pude encontrar y, por lo que he visto, parece posible save los files gif directamente desde un browser al rollo de la camera e incluso si no animan allí, retienen esa propiedad cuando se abre en otro progtwig, así que estoy esperando que lo que estoy tratando de hacer sea al less posible:)

Gracias por cualquier ayuda, he incluido mi creación de gif y los bashs fallidos de copydo a continuación ..

- (void) makeGifFile { //////////////////// NSDictionary *fileProperties = @{ (__bridge id)kCGImagePropertyGIFDictionary: @{ (__bridge id)kCGImagePropertyGIFLoopCount: @0, // 0 means loop forever } }; /////////////////// NSDictionary *frameProperties = @{ (__bridge id)kCGImagePropertyGIFDictionary: @{ (__bridge id)kCGImagePropertyGIFDelayTime: @0.06f, // a float (not double!) in seconds, rounded to centiseconds in the GIF data } }; /////////////////////// NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]; NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"]; //////////////////////// CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, self.screenshotnumber, NULL); CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties); ///////////////////////////////// for (NSUInteger i = 1; i < self.screenshotnumber+1; i++) { @autoreleasepool { //// NSString *name = [NSString stringWithFormat: @"Screenshot%d", i]; NSString *pathstring = [NSString stringWithFormat: @"Documents/%@.png", name]; NSString *gifPath = [NSHomeDirectory() stringByAppendingPathComponent:pathstring]; ///// UIImage *image = [UIImage imageWithContentsOfFile:gifPath]; CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties); } } /////////////////////////////////////// if (!CGImageDestinationFinalize(destination)) { NSLog(@"failed to finalize image destination"); } CFRelease(destination); NSLog(@"url=%@", fileURL); ////////////////////////////// /// /// saved in documents directory ///////////////////////////// ////////////////////////// ////// ///// now move to camera roll /////////////////////// ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; NSString *documentDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *gifImagePath = [NSString stringWithFormat:@"%@/%@", documentDirectory, @"animated.gif"]; UIImage *gifImage = [UIImage imageWithContentsOfFile:gifImagePath]; UIImageWriteToSavedPhotosAlbum(gifImage, nil, nil, nil); CCLOG(@"wrote to camera roll"); //////////////////////// gets saved as JPG not gif //////// next try... NSData *data = [NSData dataWithContentsOfFile:gifImagePath]; // Your GIF file path which you might have saved in NSDocumentDir or NSTempDir [library writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { if (error) { NSLog(@"Error Saving GIF to Photo Album: %@", error); } else { // TODO: success handling NSLog(@"GIF Saved to %@", assetURL); // success(gifImagePath); } }]; /////////// also gets saved as jpg } 

Mis methods para crear capturas de pantalla para los interesados ​​… He perdido la pista de la publicación en la que encontré esto … si alguien me puede proporcionar el enlace, le daré el debido crédito aquí …

Incluido para tener todas las funciones relevantes juntas en caso de que ayude a alguien más 🙂

 -(UIImage*) screenshotWithStartNode:(CCNode*)startNode { [CCDirector shanetworkingDirector].nextDeltaTimeZero = YES; CGSize viewSize = [[CCDirector shanetworkingDirector] viewSize]; CCRenderTexture* rtx = [CCRenderTexture renderTextureWithWidth:viewSize.width height:viewSize.height]; [rtx begin]; [startNode visit]; [rtx end]; return [rtx getUIImage]; } - (void) saveScreenShotWithName: (NSString*) name { CCScene *scene = [[CCDirector shanetworkingDirector] runningScene]; CCNode *n = [scene.children objectAtIndex:0]; UIImage *tempimage = [self screenshotWithStartNode:n]; NSString *pathstring = [NSString stringWithFormat: @"Documents/%@.png", name]; NSString *savePath = [NSHomeDirectory() stringByAppendingPathComponent:pathstring]; // Write image to PNG [UIImagePNGRepresentation(tempimage) writeToFile:savePath atomically:YES]; } 

El bucle simple crea files y luego otro borra los files del directory de documentos después de la creación de gif.

Lamentablemente, esto no se puede resolver. La razón de esto es que la aplicación Fotos no puede (en este momento) mostrar GIF animados y solo muestra un cuadro del GIF como image estática. Sin embargo, eso no significa que el gif no se guardó correctamente. No he probado tu código pero todo parece correcto.

Hay una forma de probar esto. En la aplicación Mensajes (por ejemplo) los GIF se reproducen correctamente, por lo que si comparte la image GIF desde la aplicación Fotos a través de ActivityController, select Mensaje y luego envíelo a usted mismo, debería ver imágenes GIF animadas en la aplicación Mensajes.