Como salvar uma imagem na biblioteca de fotos do iPhone?
193
O que preciso fazer para salvar uma imagem que meu programa gerou (possivelmente da câmera, possivelmente não) para a biblioteca de fotos do sistema no iPhone?
UIImageWriteToSavedPhotosAlbum(UIImage*image,
id completionTarget,
SEL completionSelector,void*contextInfo);
Você só precisa completionTarget , completionSelector e contextInfo se você quiser ser notificado quando o UIImageé feito salvar, caso contrário, você pode passar nil.
Oi, obrigado pela sua ótima solução. Aqui eu tenho uma dúvida de como podemos evitar duplicatas enquanto salvamos imagens na biblioteca de fotos. Desde já, obrigado.
Agora você precisará adicionar 'Privacidade - Descrição da utilização das adições à biblioteca de fotos' no iOS 11 para salvar as fotos do álbum dos usuários.
horsejockey
1
como dar um nome às imagens salvas?
Priyal
63
Descontinuado no iOS 9.0.
Há muito mais rápido do que o modo UIImageWriteToSavedPhotosAlbum de fazê-lo usando o iOS 4.0+ ou mais
Existe uma maneira de salvar metadados arbitrários junto com a foto?
perfil completo de zakdances
2
Eu tentei salvar usando ALAssetsLibrary, leva apenas o mesmo tempo para salvar como UIImageWriteToSavedPhotosAlbum.
Hlung 05/05
E este congela a câmera :( Eu acho que não é fundo suportado?
Hlung
Este é muito mais limpo porque você pode usar um bloco para lidar com a conclusão.
Jspwain #
5
Estou usando esse código e incluindo esta estrutura #import <AssetsLibrary / AssetsLibrary.h> não a AVFoundation. A resposta não deve ser editada? @Denis
Basta passar as imagens de uma matriz para ela da seguinte maneira
-(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);}}
Desculpe pelo erro de digitação apenas fez isso em tempo real, mas você entendeu
// 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 imagem que você deseja salvar, adicione-a a um 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);}}
Se você não desejar ser notificado quando a imagem terminar de salvar, poderá passar nulo nos parâmetros de conclusãoTarget , conclusãoSeletor e contextInfo .
O importante a ser observado aqui é que seu método que observa o salvamento da imagem deve ter esses três parâmetros, caso contrário, você encontrará erros do NSInvocation.
Respostas:
Você pode usar esta função:
Você só precisa completionTarget , completionSelector e contextInfo se você quiser ser notificado quando o
UIImage
é feito salvar, caso contrário, você pode passarnil
.Veja a documentação oficial para
UIImageWriteToSavedPhotosAlbum()
.fonte
Descontinuado no iOS 9.0.
Há muito mais rápido do que o modo UIImageWriteToSavedPhotosAlbum de fazê-lo usando o iOS 4.0+ ou mais
fonte
ALAssetsLibrary
, leva apenas o mesmo tempo para salvar comoUIImageWriteToSavedPhotosAlbum
.A maneira mais simples é:
Para
Swift
, você pode consultar Salvando na biblioteca de fotos do iOS usando swiftfonte
Uma coisa a lembrar: se você usar um retorno de chamada, verifique se o seletor está em conformidade com o seguinte formato:
Caso contrário, ocorrerá um erro como o seguinte:
[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
fonte
Basta passar as imagens de uma matriz para ela da seguinte maneira
Desculpe pelo erro de digitação apenas fez isso em tempo real, mas você entendeu
fonte
Ao salvar uma matriz de fotos, não use um loop for, faça o seguinte
fonte
Em Swift :
fonte
A função abaixo funcionaria. Você pode copiar daqui e colar lá ...
fonte
Swift 4
fonte
minha última resposta vai fazer isso ..
para cada imagem que você deseja salvar, adicione-a a um NSMutableArray
fonte
fonte
Criei uma categoria UIImageView para isso, com base em algumas das respostas acima.
Arquivo de cabeçalho:
Implementação
Agora, basta chamar esta função na visualização de imagem:
Opcionalmente, você pode alterar o parâmetro minimumPressDuration.
fonte
No Swift 2.2
Se você não desejar ser notificado quando a imagem terminar de salvar, poderá passar nulo nos parâmetros de conclusãoTarget , conclusãoSeletor e contextInfo .
Exemplo:
O importante a ser observado aqui é que seu método que observa o salvamento da imagem deve ter esses três parâmetros, caso contrário, você encontrará erros do NSInvocation.
Espero que ajude.
fonte
Você pode usar isso
fonte