Como posso salvar uma imagem no rolo da câmera?

126

Eu sou novo no Xcode (usando 4.3) e não sei como salvar uma imagem no rolo da câmera do dispositivo. Tudo o que fiz até agora foi configurar um IBAction para o botão para salvar a imagem. Qual método ou função da biblioteca posso usar para salvar uma imagem no rolo da câmera do usuário?

user1470914
fonte

Respostas:

238

Você usa a UIImageWriteToSavedPhotosAlbum()função

//Let's say the image you want to save is in a UIImage called "imageToBeSaved"
UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);

Editar:

//ViewController.m
- (IBAction)onClickSavePhoto:(id)sender{

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}
pasawaya
fonte
Digamos que eu tenha '- (IBAction) onClickSavePhoto: (id) sender;' no meu arquivo ViewController.h, usando o que você tem acima, o que exatamente eu precisaria colocar no arquivo ViewController.m? Muito obrigado novamente!
usar o seguinte comando
1
@ user1470914 Veja minha edição. Além disso, onde você está salvando a imagem no rolo da câmera? Ele já está no pacote do seu aplicativo ou o usuário tira uma foto e a salva no rolo da câmera?
pasawaya
Obrigado pela paciência qegal. Não tive a chance de revisar esse problema até agora. Seu EDIT nos super útil. A imagem está no pacote do aplicativo. Existem várias imagens no aplicativo e elas podem ser visualizadas como pequenas miniaturas. Quando uma miniatura pequena é selecionada, ela passa para uma nova visualização e uma versão em tela cheia pode ser visualizada. Eu tenho um botão no canto direito da navegação superior que diz "salvar" e este é o botão que desejo salvar a imagem no rolo cameral do dispositivo para que possa ser aplicada como papel de parede. Agradecemos novamente por sua ajuda e paciência (não sei por que o casperOne fechou isso).
user1470914
Eu também adicionei UIImageView *imageToBeSaved;ao meu arquivo .h. Eu pensei que eu teria que adicionar @synthesize imageToBeSavedno meu .m, mas eu recebo um erro que diz "faltando contexto para declaração implementação propriedade"
user1470914
4
A partir do iOS10, é obrigatório usar a chave NSPhotoLibraryUsageDescription no plist. Caso contrário, o aplicativo trava.
ASLLOP 26/01
56

Aqui está uma resposta para iOS8 + usando a estrutura Fotos.

Objetivo-C:

#import <Photos/Photos.h>

UIImage *snapshot = self.myImageView.image;

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
    changeRequest.creationDate          = [NSDate date];
} completionHandler:^(BOOL success, NSError *error) {
    if (success) {
        NSLog(@"successfully saved");
    }
    else {
        NSLog(@"error saving to photos: %@", error);
    }
}];

Rápido:

// Swift 4.0
import Photos

let snapshot: UIImage = someImage

PHPhotoLibrary.shared().performChanges({
    PHAssetChangeRequest.creationRequestForAsset(from: snapshot)
}, completionHandler: { success, error in
    if success {
        // Saved successfully!
    }
    else if let error = error {
        // Save photo failed with error
    }
    else {
        // Save photo failed with no error
    }
})

Aqui está um link para a documentação da Apple.

Não se esqueça de adicionar a chave / valor apropriado ao seu info.plist para solicitar permissão para acessar a biblioteca de fotos:

<key>NSCameraUsageDescription</key>
<string>Enable camera access to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Enable photo library access to select a photo from your library.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Enable photo library access to save images to your photo library directly from the app.</string>
digitalHound
fonte
2
Como pode obter a imagem url @ricardopereira
Mansuu ....
@Mansuu Por favor, dê uma olhada no stackoverflow.com/a/37248867/3641812
ricardopereira 17/17
9

Para referência, você pode salvar vídeos de maneira semelhante:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Você pode salvar um vídeo para fazer o upload no Instagram, por exemplo:

// Save video to camera roll; we can share to Instagram from there.
-(void)didTapShareToInstagram:(id)sender { 
    UISaveVideoAtPathToSavedPhotosAlbum(self.videoPath, self, @selector(video:didFinishSavingWithError:contextInfo:), (void*)CFBridgingRetain(@{@"caption" : caption}));
}

- (void)               video: (NSString *) videoPath
    didFinishSavingWithError: (NSError *) error
                 contextInfo: (void *) contextInfoPtr {

    NSDictionary *contextInfo = CFBridgingRelease(contextInfoPtr);
    NSString *caption         = contextInfo[@"caption"];

    NSString *escapedString   = [videoPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString
    NSString *escapedCaption  = [caption stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString

    NSURL *instagramURL       = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@", escapedString, escapedCaption]];

    [[UIApplication sharedApplication] openURL:instagramURL];
}
Graham Perks
fonte
4

Salve a imagem na biblioteca de fotos no Swift 4

Adicione "Privacidade - Descrição do uso das adições à biblioteca de fotos" em info.plist

Em seguida, use o seguinte código para salvar a imagem

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
Mahesh Chaudhari
fonte
0

Use asImage () para obter conteúdo exclusivo para salvar no rolo da câmera.

Se você usar asImage (), poderá salvar uma variedade de coisas divertidas no rolo da câmera com apenas algumas linhas de código! Isso pode ser muito poderoso se o objeto já tiver alguma transparência incorporada.

asImage () funciona com UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView para nomear alguns objetos (mas eles podem precisar estar visíveis quando você obtém a imagem (com um alfa diferente de zero)). Eu até o uso para capturar lado a lado, mas isso já está carregado em um UIImageView no meu design. Eu suspeito que asImage () também possa funcionar com muitos outros tipos de objetos, mas tentei apenas os que mencionei.

Se for um UITextView e você definir a cor do plano de fundo como .clear, o texto será salvo com um plano de fundo transparente. Se o seu texto contiver emoji ou Memoji, você poderá inseri-las no rolo da câmera ou no UIImageViews interno ao seu aplicativo. Ter Memoji / Emoji com um fundo transparente no rolo da câmera, onde eles podem ser usados ​​em qualquer variedade de aplicativos, é poderoso.

Outros objetos podem ter alguma transparência se você cortar uma imagem fotográfica em um círculo ou definir o raio do canto para cortar os cantos.

Observe no meu código, pointerToTextObjectSelected é um UITextView


var pointerToTextObjectSelected = UITextView()
// above populated elsewhere

let thisObject = pointerToTextObjectSelected.asImage()

let imageData = thisObject.pngData()

let imageToSave = UIImage(data: imageData!)

UIImageWriteToSavedPhotosAlbum(imageToSave!, nil, nil, nil)

user3408691
fonte