Wie kann ich ein Bild auf der Kamerarolle speichern?

126

Ich bin neu in Xcode (mit 4.3) und nicht sicher, wie ich ein Bild auf der Kamerarolle des Geräts speichern soll. Bisher habe ich lediglich eine IBAction für die Schaltfläche zum Speichern des Bildes eingerichtet. Mit welcher Bibliotheksmethode oder -funktion kann ich ein Bild auf der Kamerarolle des Benutzers speichern?

user1470914
quelle

Antworten:

238

Sie verwenden die UIImageWriteToSavedPhotosAlbum()Funktion.

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

Bearbeiten:

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

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}
Pasawaya
quelle
Angenommen, ich habe '- (IBAction) onClickSavePhoto: (id) sender;' Was würde ich in meiner ViewController.h-Datei unter Verwendung der obigen Angaben genau in die ViewController.m-Datei einfügen müssen? Nochmals vielen Dank!
user1470914
1
@ user1470914 Siehe meine Bearbeitung. Woher erhalten Sie das Bild, das auf der Kamerarolle gespeichert werden soll? Befindet es sich bereits im Bundle Ihrer App oder nimmt der Benutzer ein Bild auf und speichert es dann auf der Kamerarolle?
Pasawaya
Vielen Dank für Ihre Geduld qegal. Ich hatte bis jetzt keine Gelegenheit, dieses Problem erneut zu behandeln. Ihre EDIT uns super hilfreich. Das Bild befindet sich im App-Bundle. Die App enthält mehrere Bilder, die als kleine Miniaturansichten angezeigt werden können. Wenn eine kleine Miniaturansicht ausgewählt ist, wird eine neue Ansicht aufgerufen und eine Vollbildversion angezeigt. Ich habe eine Schaltfläche in der rechten Ecke des oberen Navigationsgeräts mit der Aufschrift "Speichern". Dies ist die Schaltfläche, mit der ich das Bild auf der Kamerarolle des Geräts speichern möchte, damit es als Hintergrundbild verwendet werden kann. Nochmals vielen Dank für Ihre Hilfe und Geduld (nicht sicher, warum casperOne dies geschlossen hat).
user1470914
Ich habe auch UIImageView *imageToBeSaved;zu meiner .h-Datei hinzugefügt . Ich dachte, dass ich @synthesize imageToBeSavedin meiner .m hinzufügen müsste, aber ich erhalte eine Fehlermeldung, dass "fehlender Kontext für die Deklaration der Eigenschaftsimplementierung"
user1470914
4
Ab iOS10 ist die Verwendung des NSPhotoLibraryUsageDescription-Schlüssels in plist obligatorisch. Ansonsten stürzt die App ab.
ASLLOP
56

Hier ist eine Antwort für iOS8 + mithilfe des Fotos-Frameworks.

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

Schnell:

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

Hier ist ein Link zur Apple-Dokumentation.

Vergessen Sie nicht, Ihrer info.plist den entsprechenden Schlüssel / Wert hinzuzufügen, um die Erlaubnis zum Zugriff auf die Fotobibliothek anzufordern:

<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
quelle
2
Wie kann man das Bild bekommen URL @ricardopereira
Mansuu ....
@ Mansuu Bitte werfen Sie einen Blick auf stackoverflow.com/a/37248867/3641812
Ricardopereira
9

Als Referenz können Sie Videos auf ähnliche Weise speichern:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Vielleicht möchten Sie ein Video speichern, um es auf Instagram hochzuladen, zum Beispiel:

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

Speichern Sie das Bild in der Fotobibliothek in Swift 4

Fügen Sie "info - Photo Library Additions Usage Description" in info.plist hinzu

Verwenden Sie dann den folgenden Code, um das Bild zu speichern

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

Verwenden Sie asImage (), um eindeutige Inhalte abzurufen, die auf der Kamerarolle gespeichert werden sollen.

Wenn Sie asImage () verwenden, können Sie mit nur wenigen Codezeilen eine Vielzahl lustiger Dinge auf der Kamerarolle speichern! Dies kann sehr leistungsfähig sein, wenn das Objekt bereits eine gewisse Transparenz aufweist.

asImage () funktioniert mit UITextView, WKWebView, UIImageView, UIButton, UISlider und UITableView, um einige Objekte zu benennen (diese müssen jedoch möglicherweise sichtbar sein, wenn Sie das Bild erhalten (mit einem Alpha ungleich Null)). Ich verwende es sogar zum Erfassen von Kacheln, aber das ist bereits in meinem Design in eine UIImageView geladen. Ich vermute, dass asImage () auch mit viel mehr Objekttypen funktioniert, aber ich habe nur die von mir erwähnten ausprobiert.

Wenn es sich um eine UITextView handelt und Sie die Hintergrundfarbe auf .clear setzen, wird der Text mit einem transparenten Hintergrund gespeichert. Wenn Ihr Text Emoji oder Memoji enthält, können Sie diese Bilder jetzt in die Kamerarolle oder in UIImageViews innerhalb Ihrer App übertragen. Memoji / Emoji mit einem transparenten Hintergrund in Ihrer Kamerarolle zu haben, wo sie in einer Vielzahl von Anwendungen verwendet werden können, ist leistungsstark.

Andere Objekte haben möglicherweise eine gewisse Transparenz, wenn Sie ein Foto auf einen Kreis zuschneiden oder den Eckenradius so einstellen, dass die Ecken abgeschnitten werden.

Beachten Sie in meinem Code, dass pointerToTextObjectSelected eine UITextView ist


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
quelle