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"];
Michael Robinson
quelle
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!

Jordanien
quelle
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.

Suragch
quelle
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,

Ben Gotow
quelle
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];
}
Soumya Ranjan
quelle