¿Cómo guardar la imagen en la biblioteca de fotos del iPhone?
193
¿Qué debo hacer para guardar una imagen que mi programa ha generado (posiblemente desde la cámara, posiblemente no) en la biblioteca de fotos del sistema en el iPhone?
UIImageWriteToSavedPhotosAlbum(UIImage*image,
id completionTarget,
SEL completionSelector,void*contextInfo);
Solo necesita completeTarget , completeSelector y contextInfo si desea recibir una notificación cuando termine deUIImage guardar, de lo contrario puede pasar nil.
Hola, gracias por tu gran solución. Aquí tengo una duda de cómo podemos evitar duplicados al guardar la imagen en la biblioteca de fotos. Gracias por adelantado.
Ahora tendrá que agregar 'Privacidad - Descripción de uso de adiciones a la biblioteca de fotos' a partir de iOS 11 para guardar las fotos del álbum de los usuarios.
horsejockey
1
¿Cómo dar un nombre a las imágenes guardadas?
Priyal
63
En desuso en iOS 9.0.
Hay mucho más rápido que UIImageWriteToSavedPhotosAlbum para hacerlo usando iOS 4.0+ AssetsLibrary framework
¿Hay alguna manera de guardar metadatos arbitrarios junto con la foto?
zakdances
2
Traté de guardar usando ALAssetsLibrary, toma exactamente el mismo tiempo para guardar como UIImageWriteToSavedPhotosAlbum.
Hlung
Y esto congela la cámara :( ¿Supongo que no es compatible con el fondo?
Hlung 05 de
Este es mucho más limpio b / c que puede usar un bloque para manejar la finalización.
jpswain
55
Estoy usando este código e incluyo este marco #import <AssetsLibrary / AssetsLibrary.h> no la AVFoundation. ¿No debería ser editada la respuesta? @Denis
Simplemente pasa las imágenes de una matriz a ella así
-(void) saveMePlease {//Loop through the array herefor(int i=0:i<[arrayOfPhotos count]:i++){NSString*file =[arrayOfPhotos objectAtIndex:i];NSString*path =[get the path of the image like you would in DOCS FOLDER or whatever];NSString*imagePath =[path stringByAppendingString:file];UIImage*image =[[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];//Now it will do this for each photo in the arrayUIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);}}
Perdón por los errores tipográficos que acabo de hacer sobre la marcha pero entiendes
Al usar esto, echaré de menos algunas de las fotos, lo he probado. La forma correcta de hacerlo es usar la devolución de llamada desde el selector de finalización.
SamChen
1
¿podemos guardar imágenes con el nombre personalizado?
Usuario 1531343
Uno nunca debe usar for loop para esto. Conduce a la condición de carrera y se bloquea.
saurabh
4
Al guardar una gran variedad de fotos, no use un bucle for, haga lo siguiente
-(void)saveToAlbum{[self performSelectorInBackground:@selector(startSavingToAlbum) withObject:nil];}-(void)startSavingToAlbum{
currentSavingIndex =0;UIImage* img = arrayOfPhoto[currentSavingIndex];//get your imageUIImageWriteToSavedPhotosAlbum(img,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);}-(void)image:(UIImage*) image didFinishSavingWithError:(NSError*) error contextInfo:(void*) contextInfo{//can also handle error message as well
currentSavingIndex ++;if(currentSavingIndex >= arrayOfPhoto.count){return;//notify the user it's done.}else{UIImage* img = arrayOfPhoto[currentSavingIndex];UIImageWriteToSavedPhotosAlbum(img,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);}}
// Save it to the camera roll / saved photo album// UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, nil, nil, nil) or UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image,self,"image:didFinishSavingWithError:contextInfo:",nil)
func image(image:UIImage!, didFinishSavingWithError error:NSError!, contextInfo:AnyObject!){if(error !=nil){// Something wrong happened.}else{// Everything is alright.}}
para cada imagen que desee guardar, agréguela a un NSMutableArray
//in the .h file put:NSMutableArray*myPhotoArray;///then in the .m-(void) viewDidLoad {
myPhotoArray =[[NSMutableArray alloc]init];}//However Your getting images-(void) someOtherMethod {UIImage*someImage =[your prefered method ofusingthis];[myPhotoArray addObject:someImage];}-(void) saveMePlease {//Loop through the array herefor(int i=0:i<[myPhotoArray count]:i++){NSString*file =[myPhotoArray objectAtIndex:i];NSString*path =[get the path of the image like you would in DOCS FOLDER or whatever];NSString*imagePath =[path stringByAppendingString:file];UIImage*image =[[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];//Now it will do this for each photo in the arrayUIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);}}
Si no desea recibir una notificación cuando la imagen se haya guardado, puede pasar nulo en los parámetros completeTarget , completeSelector y contextInfo .
Lo importante a tener en cuenta aquí es que su método que observa el guardado de la imagen debe tener estos 3 parámetros; de lo contrario, se encontrará con errores de NSInvocation.
Respuestas:
Puedes usar esta función:
Solo necesita completeTarget , completeSelector y contextInfo si desea recibir una notificación cuando termine de
UIImage
guardar, de lo contrario puede pasarnil
.Consulte la documentación oficial para
UIImageWriteToSavedPhotosAlbum()
.fuente
En desuso en iOS 9.0.
Hay mucho más rápido que UIImageWriteToSavedPhotosAlbum para hacerlo usando iOS 4.0+ AssetsLibrary framework
fuente
ALAssetsLibrary
, toma exactamente el mismo tiempo para guardar comoUIImageWriteToSavedPhotosAlbum
.La forma más simple es:
Para
Swift
, puede consultar Guardar en la biblioteca de fotos de iOS usando swiftfuente
Una cosa para recordar: si usa una devolución de llamada, asegúrese de que su selector cumpla con el siguiente formulario:
De lo contrario, se bloqueará con un error como el siguiente:
[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
fuente
Simplemente pasa las imágenes de una matriz a ella así
Perdón por los errores tipográficos que acabo de hacer sobre la marcha pero entiendes
fuente
Al guardar una gran variedad de fotos, no use un bucle for, haga lo siguiente
fuente
En Swift :
fuente
La siguiente función funcionaría. Puede copiar desde aquí y pegar allí ...
fuente
Swift 4
fuente
mi última respuesta lo hará ..
para cada imagen que desee guardar, agréguela a un NSMutableArray
fuente
fuente
Creé una categoría UIImageView para esto, basada en algunas de las respuestas anteriores.
Archivo de cabecera:
Implementación
Ahora simplemente llame a esta función en su vista de imagen:
Opcionalmente, puede modificar el parámetro mínimo PressDuration.
fuente
En Swift 2.2
Si no desea recibir una notificación cuando la imagen se haya guardado, puede pasar nulo en los parámetros completeTarget , completeSelector y contextInfo .
Ejemplo:
Lo importante a tener en cuenta aquí es que su método que observa el guardado de la imagen debe tener estos 3 parámetros; de lo contrario, se encontrará con errores de NSInvocation.
Espero eso ayude.
fuente
Puedes usar esto
fuente