¿Cómo puedo guardar una imagen en el carrete de la cámara?

126

Soy nuevo en Xcode (usando 4.3) y no estoy seguro de cómo guardar una imagen en el carrete de la cámara del dispositivo. Todo lo que he hecho hasta ahora es configurar una IBAction para que el botón guarde la imagen. ¿Qué método o función de biblioteca puedo usar para guardar una imagen en el carrete de la cámara del usuario?

usuario1470914
fuente

Respuestas:

238

Usas la UIImageWriteToSavedPhotosAlbum()función.

//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
fuente
Digamos que tengo '- (IBAction) onClickSavePhoto: (id) sender;' en mi archivo ViewController.h, usando lo que tiene arriba, ¿qué necesitaría colocar exactamente en el archivo ViewController.m? Muchas gracias de nuevo!
user1470914
1
@ user1470914 Ver mi edición. Además, ¿de dónde sacas la imagen para guardarla en el carrete de la cámara? ¿Ya está en el paquete de su aplicación, o el usuario toma una foto y luego la guarda en el carrete?
pasawaya
Gracias por tu paciencia qegal. No he tenido la oportunidad de revisar este problema hasta ahora. Su EDITAR nos super útil. La imagen está en el paquete de la aplicación. Hay varias imágenes en la aplicación y se pueden ver como miniaturas pequeñas. Cuando se selecciona una miniatura pequeña, pasa a una nueva vista y se puede ver una versión de pantalla completa. Tengo un botón en la esquina derecha del navegador superior que dice "guardar" y este es el botón en el que deseo guardar la imagen en el rollo cameral del dispositivo para que pueda aplicarse como fondo de pantalla. Gracias de nuevo por su ayuda y paciencia (no estoy seguro de por qué casperOne cerró esto).
user1470914
También agregué UIImageView *imageToBeSaved;a mi archivo .h. Pensé que tendría que agregar @synthesize imageToBeSavedmi .m pero recibo un error que dice "falta el contexto para la declaración de implementación de la propiedad"
user1470914
44
A partir de iOS10, es obligatorio usar la clave NSPhotoLibraryUsageDescription en plist. De lo contrario, la aplicación se bloquea.
ASLLOP
56

Aquí hay una respuesta para iOS8 + usando el marco de fotos.

C objetivo:

#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
    }
})

Aquí hay un enlace a la documentación de Apple.

No olvide agregar la clave / valor apropiado a su info.plist para solicitar permiso para acceder a la 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
fuente
2
¿Cómo puede obtener la imagen url @ricardopereira
Mansuu ....
@Mansuu Por favor, eche un vistazo a stackoverflow.com/a/37248867/3641812
ricardopereira
9

Como referencia, puede guardar videos de manera similar:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Es posible que desee guardar un video para subirlo a Instagram, por ejemplo:

// 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
fuente
4

Guarde la imagen en la biblioteca de fotos en Swift 4

Agregue "Privacidad - Descripción de uso de adiciones a la biblioteca de fotos" en info.plist

Luego use el siguiente código para guardar la imagen

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

Use asImage () para obtener contenido único para guardar en el carrete de la cámara.

Si usa asImage (), puede guardar una variedad de cosas divertidas en el carrete de la cámara con solo unas pocas líneas de código. Esto puede ser muy poderoso si el objeto ya tiene alguna transparencia incorporada.

asImage () funciona con UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView para nombrar algunos objetos (pero es posible que necesiten estar visibles cuando obtiene la imagen (que tiene un alfa distinto de cero)). Incluso lo uso para capturar mosaicos, pero eso ya está cargado en un UIImageView en mi diseño. Sospecho que asImage () también puede funcionar con muchos más tipos de objetos, pero solo probé los que mencioné.

Si se trata de UITextView, y establece el color de fondo en .clear, el texto se guarda con un fondo transparente. Si su texto contiene emoji o Memoji, ahora puede obtener esas imágenes en el carrete de la cámara o en UIImageViews internas de su aplicación. Tener Memoji / Emoji con un fondo transparente en el carrete de la cámara donde se pueden usar en cualquier variedad de aplicaciones es poderoso.

Otros objetos pueden tener algo de transparencia si recorta una imagen fotográfica en un círculo, o establece el radio de la esquina para recortar las esquinas.

Nota en mi código, pointerToTextObjectSelected es un 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)
usuario3408691
fuente