Save An Image To Application Documents Folder From UIView On IOS

I have a UIImageView that allows a user to place and hold an image until it can be saved. The problem is, I can’t figure out how to actually save and retrieve the image I’ve placed in the view.

I have retrieved and placed the image in the UIImageView like this:

  • How do I get the name of a day of the week in the user's locale?
  • Conforming protocol privately
  • How to call initWith… in swift
  • @property and retain, assign, copy, nonatomic in Objective-C
  • how to pass objects between view controllers
  • Serialize and Deserialize Objective-C objects into JSON
  • //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];
    }
    

    It displays the selected image in my UIImageView just fine, but I have no idea how to save it. I’m saving all the other pieces of the view (mostly UITextfield) in Core Data. I’ve searched and searched, and tried many bits of code that people have suggested, but either I’m not entering the code correctly, or those suggestions don’t work with the way I have my code set up. It’s likely the former. I’d like to save the image in the UIImageView using the same action (a save button) I’m using to save the text in the UITextFields. Here’s how I’m saving my UITextField info:

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

    Like I said earlier, I have tried several methods to get this to work, but can’t get a grasp on it. For the first time in my life I’ve wanted to cause physical harm to an inanimate object, but I’ve managed to restrain myself.

    I’d like to be able to save the image the user places into the UIImageView in the application’s documents folder, and then be able to retrieve it and place it in another UIImageView for display when the user pushes that view onto the stack. Any help is greatly appreciated!

    3 Solutions Collect From Internet About “Save An Image To Application Documents Folder From UIView On IOS”

    It’s all good, man. Don’t harm yourself or others.

    You probably don’t want to store these images in Core Data, since that can impact performance if the data set grows too large. Better to write the images to files.

    NSData *pngData = UIImagePNGRepresentation(image);
    

    This pulls out PNG data of the image you’ve captured. From here, you can write it to a file:

    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
    

    Reading it later works the same way. Build the path like we just did above, then:

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

    What you’ll probably want to do is make a method that creates path strings for you, since you don’t want that code littered everywhere. It might look like this:

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

    Hope that’s helpful.

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