Speichern des Bildes im Verzeichnis "Dokumente" und Abrufen für E-Mail-Anhänge


72

Ich habe Probleme beim Herausfinden von NSBundle& DocumentDirectory-Daten. Ich habe ein Kamerabild " imageView ", das ich in der speichere, NSDocumentDirectoyund möchte es dann zum Anhängen an eine E-Mail abrufen.

Hier der Speichercode:

- (IBAction)saveImage {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *image = imageView.image; // imageView is my image from camera
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO];   
}

Hier ist der neue Datencode zum Abrufen:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    NSData *myData = [[[NSData alloc] initWithContentsOfFile:appFile] autorelease];
    [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"savedImage"];

1
Kannst du mir bitte sagen, wie du überhaupt zum Kamerabild gekommen bist? dh der Verweis auf das UIImage, das Sie mit der Kamera aufgenommen haben. Vielen Dank.
— Entferner

Wo soll die Aktion saveImage aufgerufen werden? Ich bin neu im Xcode.
— NovusMobile

Antworten:


66
- (IBAction)getImage {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];
}

Damit sollten Sie loslegen!


Danke, es ist anders als Bens Antwort, aber für den E-Mail-Anhang müssen NSData hinzugefügt werden. Ich muss etwas in Ihrer Antwort vermissen. Wie würde ich das "img: named" an die E-Mail anhängen? Danke
— Michael Robinson

[picker addAttachmentData: myData mimeType: @ "image / png" Dateiname: @ "icon"]; Die obigen "Daten" sind die nsdata-Darstellung des Bildes. "picker" ist die E-Mail-Komponente. es ist bereits beigefügt.
— Jordanien

Wird beim Speichern in Dokumenten automatisch ein eindeutiger Dateiname für das Bild generiert?
— Zakdances

1
Wenn Sie in Dokumenten speichern, übergeben Sie selbst einen Dateipfad. Sie können eine temporäre Datei erstellen mit: stackoverflow.com/questions/215820/…
— Jordanien

5

Swift 3

// Create a URL
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let imageURL = documentsURL?.appendingPathComponent("MyImageName.png")

// save image to URL
let myImage = imageView.image! // or wherever you have your UIImage

do {
    try UIImagePNGRepresentation(myImage)?.write(to: imageURL!)
} catch {}


// Use the URL to retrieve the image for sharing to email, social media, etc.
// docController.URL = imageURL
// ...

Ich erzwinge der Kürze halber das Auspacken einiger Optionen. Verwenden Sie guardoder if letin Ihrem Code.


In der Tat gibt es zwei verfügbare Fälle - .documentationDirectoryund .documentDirectory, die nicht dasselbe sind. Die Frage
— betraf das

@alexburtnik, ah, ja, wahrscheinlich. Vielen Dank für Ihre Erklärung (und für die Behebung meines Fehlers).
— Suragch

0

Da sich jede iPhone-App in einer eigenen Sandbox befindet, haben Sie keinen Zugriff auf einen geräteweiten Dokumentenordner. Um ein Bild an eine E-Mail anzuhängen, speichern Sie das Bild in Ihrem eigenen Dokumentenordner. Versuchen Sie, mit [@ "~ / Documents" StringByExpandingTildeInPath] Ihren lokalen Dokumentenordner abzurufen - das funktioniert bei mir. Es sieht so aus, als ob die Technik, mit der Sie das Bild an eine E-Mail anhängen, korrekt ist.

Hoffentlich hilft das,


Ich erhalte einen erwarteten Fehler ":" vor ";" in dieser Zeile: NSString * path = [[@ "~ Documents"] pathForResource: @ "image" ofType: @ "png"]; Irgendwelche Ideen? Vielen Dank für Ihre Hilfe.
— Michael Robinson

Denken Sie daran, den Teil "stringByExpandingTildeInPath" hinzuzufügen. (Und es muss "~ / Documents" sein, nicht "~ Documents". StringByExpandingTildeInPath ist eine Methode von NSString, die das ~ automatisch durch den Pfad zum Home-Ordner des Benutzers ersetzt.
— Ben Gotow

0

Probier diese :

 -(void)setProfilePic
{
  NSArray *docpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [docpaths objectAtIndex:0];
  NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"Image.png"];

  NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL fileURLWithPath:imagePath]];
  UIImage *thumbNail = [[UIImage alloc] initWithData:imgData];
  [profilePic_btn setBackgroundImage:thumbNail forState:UIControlStateNormal];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.