Come posso salvare un'immagine sul rullino fotografico?


126

Sono nuovo su Xcode (usando 4.3) e non sono sicuro di come salvare un'immagine sul rullino fotografico del dispositivo. Tutto quello che ho fatto finora è impostare un'IBAction per il pulsante per salvare l'immagine. Quale metodo o funzione di libreria posso usare per salvare un'immagine sul rullino fotografico dell'utente?

Risposte:


238

Si utilizza la UIImageWriteToSavedPhotosAlbum()funzione.

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

Modificare:

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

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}

Diciamo che ho "- (IBAction) onClickSavePhoto: (id) mittente;" nel mio file ViewController.h, usando quello che hai sopra, cosa dovrei esattamente inserire nel file ViewController.m? Grazie ancora!
user1470914

1
@ user1470914 Vedi la mia modifica. Inoltre, dove stai ottenendo il salvataggio dell'immagine sul rullino fotografico? È già nel pacchetto della tua app o l'utente scatta una foto e la salvi sul rullino fotografico?
pasawaya,

Grazie per la pazienza qegal. Finora non ho avuto la possibilità di rivisitare questo problema. La tua EDIT ci è di grande aiuto. L'immagine è nel bundle dell'app. Ci sono diverse immagini nell'app e possono essere visualizzate come piccole miniature. Quando viene selezionata una piccola anteprima, questa passa a una nuova vista e una versione a schermo intero può essere visualizzata. Ho un pulsante nell'angolo destro del navigatore superiore che dice "salva" e questo è il pulsante che desidero salvare l'immagine sul rotolo camerale del dispositivo in modo che possa essere applicato come sfondo. Grazie ancora per l'aiuto e la pazienza (non so perché casperOne abbia chiuso questo).
user1470914

Ho anche aggiunto UIImageView *imageToBeSaved;al mio file .h. Ho pensato che avrei dovuto aggiungere il @synthesize imageToBeSavedmio .m ma ricevo un errore che dice "contesto mancante per la dichiarazione di implementazione della proprietà"
user1470914

4
Da iOS10 in poi, è obbligatorio utilizzare la chiave NSPhotoLibraryUsageDescription in plist. Altrimenti l'app si blocca.
ASLLOP,

56

Ecco una risposta per iOS8 + utilizzando il framework Foto.

Objective-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);
    }
}];

Swift:

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

Ecco un link alla documentazione di Apple.

Non dimenticare di aggiungere la chiave / valore appropriato al tuo info.plist per richiedere l'autorizzazione ad accedere alla libreria di foto:

<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>

2
Come posso ottenere l'immagine url @ricardopereira
Mansuu ....

@Mansuu Si prega di dare un'occhiata a stackoverflow.com/a/37248867/3641812
ricardopereira

9

Per riferimento, è possibile salvare i video in modo simile:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Potresti voler salvare un video da caricare su Instagram, ad esempio:

// 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];
}

4

Salva l'immagine nella libreria di foto in Swift 4

Aggiungi "Privacy - Descrizione utilizzo aggiunte libreria foto" in info.plist

Quindi utilizzare il seguente codice per salvare l'immagine

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)

0

Usa asImage () per ottenere contenuti unici da salvare nel rullino fotografico.

Se usi asImage () puoi salvare una varietà di cose divertenti sul rullino fotografico con solo poche righe di codice! Questo può essere molto potente se l'oggetto ha già un po 'di trasparenza incorporata.

asImage () funziona con UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView per nominare alcuni oggetti (ma potrebbe essere necessario che siano visibili quando si ottiene l'immagine (con un alfa diversa da zero)). Lo uso persino per catturare la piastrellatura, ma è già stato caricato in un UIImageView nel mio progetto. Sospetto che asImage () possa funzionare anche con molti altri tipi di oggetti, ma ho provato solo quelli che ho citato.

Se si tratta di UITextView e si imposta il colore di sfondo su .clear, il testo viene salvato con uno sfondo trasparente. Se il tuo testo contiene emoji o Memoji, ora puoi inserire quelle immagini nel rullino fotografico o in UIImageViews all'interno della tua app. Avere Memoji / Emoji con uno sfondo trasparente nel rullino fotografico dove possono essere utilizzati in qualsiasi varietà di applicazioni è potente.

Altri oggetti potrebbero avere una certa trasparenza se ritagli l'immagine di una foto in un cerchio o imposti il ​​raggio dell'angolo per tagliare gli angoli.

Nota nel mio codice pointerToTextObjectSelected è 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.