Speichern eines Abbilds in den Anwendungsdokumentordner von UIView On IOS

Ich habe ein UIImageView, mit dem ein Benutzer ein Bild platzieren und halten kann, bis es gespeichert werden kann. Das Problem ist, ich kann nicht herausfinden, wie ich das Bild, das ich in der Ansicht platziert habe, tatsächlich speichern und abrufen kann.

Ich habe das Bild in der UIImageView wie folgt abgerufen und platziert:

//Get Image - (void) getPicture:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; [self presentModalViewController:picker animated:YES]; [picker release]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo { myPic.image = image; [picker dismissModalViewControllerAnimated:YES]; } 

Es zeigt das ausgewählte Bild in meinem UIImageView an, aber ich habe keine Ahnung, wie es gespeichert wird. Ich speichere alle anderen Teile der Ansicht (hauptsächlich UITextfield) in Core Data. Ich habe viele Codes gesucht und durchsucht, die von den Leuten vorgeschlagen wurden, aber entweder gebe ich den Code nicht richtig ein, oder diese Vorschläge funktionieren nicht mit der Art, wie ich meinen Code eingerichtet habe. Es ist wahrscheinlich ersteres. Ich möchte das Bild in der UIImageView mit der gleichen Aktion speichern (eine Schaltfläche zum Speichern), die ich verwende, um den Text in den UITextFields zu speichern. So speichere ich meine UITextField-Info:

 // Handle Save Button - (void)save { // Get Info From UI [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"]; 

Wie ich bereits sagte, habe ich verschiedene Methoden ausprobiert, um das zu erreichen, aber ich verstehe es nicht. Zum ersten Mal in meinem Leben wollte ich einem unbelebten Objekt körperlichen Schaden zufügen, aber es gelang mir, mich zurückzuhalten.

Ich möchte in der Lage sein, das Bild zu speichern, das der Benutzer in den UIImageView im Dokumentenordner der Anwendung legt, und es dann abrufen und in einem anderen UIImageView zur Anzeige platzieren zu können, wenn der Benutzer diese Ansicht auf den Stapel verschiebt. Jede Hilfe wird sehr geschätzt!

Es ist alles gut, Mann. Schädige dich und andere nicht.

Wahrscheinlich möchten Sie diese Bilder nicht in Core Data speichern, da dies die performance beeinträchtigen kann, wenn der Datensatz zu groß wird. Besser, die Bilder in Dateien zu schreiben.

 NSData *pngData = UIImagePNGRepresentation(image); 

Dadurch werden PNG-Daten des aufgenommenen Bilds abgerufen. Von hier aus können Sie es in eine Datei schreiben:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name [pngData writeToFile:filePath atomically:YES]; //Write the file 

Das Lesen später funktioniert genauso. Baue den Pfad wie oben beschrieben, dann:

 NSData *pngData = [NSData dataWithContentsOfFile:filePath]; UIImage *image = [UIImage imageWithData:pngData]; 

Was Sie wahrscheinlich tun möchten, ist eine Methode, die Pfadzeichenfolgen für Sie erstellt, da Sie nicht möchten, dass dieser Code überall verstreut ist. Es könnte so aussehen:

 - (NSString *)documentsPathForFileName:(NSString *)name { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; return [documentsPath stringByAppendingPathComponent:name]; } 

Ich hoffe, das ist hilfreich.

Swift 3.0 Version

 let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG do{ try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG }catch let error{ print(error.localizedDescription) } 

In Swift:

 let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true) if let path = paths[0]?.stringByAppendingPathComponent(imageName) { do { try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic) } catch { return } } 

Dies ist die Antwort von Fangming Ning für Swift 3/4 , aktualisiert mit einer empfohlenen und mehr Swifty-Methode zum Abrufen des Dokumentenverzeichnispfads und mit besserer Dokumentation. Dank an Fangming Ning für die neue Methode.

 guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } //Using force unwrapping here because we're sure "1.jpg" exists. Remember, this is just an example. let img = UIImage(named: "1.jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg").absoluteString) do { //Use UIImagePNGRepresentation if you want to save as PNG. //.atomic is just an example here, check out other writing options as well. (see the link under this example) //(atomic writes data to a temporary file first and sending that file to its final destination) try UIImageJPEGRepresentation(img, 1)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) } 

Hier finden Sie alle möglichen Datenschreiboptionen.

Swift 4 mit Erweiterung

 extension UIImage{ func saveImage(inDir:FileManager.SearchPathDirectory,name:String){ guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else { return } let img = UIImage(named: "\(name).jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString) do { try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) } } } 

Verwendungsbeispiel

  image.saveImage(inDir: .documentDirectory, name: "pic")