72

I having trouble figuring out NSBundle & DocumentDirectory data, I have a Camera Picture "imageView" that I'm saving to the NSDocumentDirectoy and then want to retrieve it for attaching to an email,

Here the saving code:

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

Here is the new getting data code:

    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"];
Kumar KL
  • 15,315
  • 9
  • 38
  • 60
Michael Robinson
  • 1,439
  • 2
  • 16
  • 23

4 Answers4

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

This should get you started!

Jordan
  • 21,746
  • 10
  • 51
  • 63
  • Thanks, It's different than Ben's answer but the email attachment needs NSData to be added, I must be missing something in you answer. How would I attach the "img: named to the email? Thanks – Michael Robinson Jan 10 '10 at 16:41
  • [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"icon"]; The "data" above is the nsdata representation of the image. "picker" is the email component. it's already attached. – Jordan Jan 10 '10 at 17:44
  • Does saving it to documents automatically generate a unique file name for the image? – zakdances Jun 11 '12 at 17:13
  • 1
    When you save to documents, you pass in a file path yourself. You can create a temp file using: http://stackoverflow.com/questions/215820/how-do-i-create-a-temporary-file-with-cocoa – Jordan Jun 28 '12 at 07:30
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
// ...

I force unwrapped some of the optionals for brevity. Use guard or if let in your code.

alexburtnik
  • 7,661
  • 4
  • 32
  • 70
Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
  • In fact there are two available cases - `.documentationDirectory` and `.documentDirectory`, which are not the same thing. The question was about documents directory so I guess you just picked a wrong value from code completion suggestions ;) – alexburtnik Jun 18 '17 at 22:20
  • @alexburtnik, ah, yes, probably. Thank your for your explanation (and for fixing my mistake). – Suragch Jun 18 '17 at 22:52
0

Because each iPhone app is in it's own sandbox, you don't have access to a device-wide documents folder. To attach an image to an email, save the image in your own documents folder. Try using [@"~/Documents" StringByExpandingTildeInPath] to get your local documents folder - that works for me. It looks like the technique you're using for attaching the image to an email is correct.

Hope that helps,

Dhara
  • 4,093
  • 2
  • 36
  • 69
Ben Gotow
  • 14,805
  • 3
  • 42
  • 47
  • I'm getting a error expected ":" before ";" on this line: NSString *path = [[@"~Documents"] pathForResource:@"image" ofType:@"png"]; Any Ideas? Thanks for both you help. – Michael Robinson Jan 10 '10 at 16:36
  • Remember to add the "stringByExpandingTildeInPath" part. (And it needs to be "~/Documents", not "~Documents". stringByExpandingTildeInPath is a method of NSString that will automatically replace the ~ with the path to the user's home folder. – Ben Gotow Jan 10 '10 at 18:13
0

Try this one :

 -(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
  • 4,817
  • 2
  • 26
  • 51