Wie speichere ich ein UIImage in einer Datei?

110

Wenn ich habe UIImagevon einem imagePicker, wie kann ich es in einen Unterordner im Dokumentenverzeichnis speichern?

user1542660
quelle

Antworten:

129

Natürlich können Sie Unterordner im Dokumentenordner Ihrer App erstellen. Das NSFileManagermachst du früher .

Sie UIImagePNGRepresentationkonvertieren Ihr Image in NSData und speichern es auf der Festplatte.

// Create path.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];

// Save image.
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];

Core Data hat übrigens nichts mit dem Speichern von Bildern auf der Festplatte zu tun.

SchlagzeugerB
quelle
Sie verlieren alle Orientierungsinformationen, wenn Sie UIImagePNGRepresentation verwenden.
1
Wie kann ich Bilder speichern, ohne Informationen zu verlieren?
Pol
@Pol können Sie es entweder als UIImageJPEGRepresentation speichern oder die Ausrichtung selbst festlegen, verschiedene Lösungen im Link stackoverflow.com/questions/3554244/…
user1210182
26

In Swift 3:

// Create path.
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let filePath = "\(paths[0])/MyImageName.png"

// Save image.
UIImagePNGRepresentation(image)?.writeToFile(filePath, atomically: true)
NatashaTheRobot
quelle
3
Nicht mehr gültig - Sie müssen verwenden.write() throws
Andrew K
17

Die oben genannten Informationen sind nützlich, beantworten jedoch nicht Ihre Frage, wie Sie in einem Unterverzeichnis speichern oder das Bild von einem UIImagePicker abrufen können.

Zunächst müssen Sie angeben, dass Ihr Controller den Delegaten der Bildauswahl in einer .m- oder .h-Codedatei implementiert, z.

@interface CameraViewController () <UIImagePickerControllerDelegate>

@end

Anschließend implementieren Sie die imagePickerController: didFinishPickingMediaWithInfo: -Methode des Delegaten. Hier können Sie das Foto aus der Bildauswahl abrufen und speichern (natürlich haben Sie möglicherweise eine andere Klasse / ein anderes Objekt, das bzw. das das Speichern übernimmt, aber ich zeige nur den Code innerhalb der Methode):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // get the captured image
    UIImage *image = (UIImage *)info[UIImagePickerControllerOriginalImage];


    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *imageSubdirectory = [documentsDirectory stringByAppendingPathComponent:@"MySubfolderName"];

    NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.png"];

    // Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to PNG spec
    NSData *imageData = UIImagePNGRepresentation(image); 
    [imageData writeToFile:filePath atomically:YES];
}

Wenn Sie als JPEG-Bild speichern möchten, lauten die letzten 3 Zeilen:

NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.jpg"];

// Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to JPG spec
NSData *imageData = UIImageJPEGRepresentation(image, 0.85f); // quality level 85%
[imageData writeToFile:filePath atomically:YES];
Alex der Ukrainer
quelle
12
extension UIImage {
    /// Save PNG in the Documents directory
    func save(_ name: String) {
        let path: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let url = URL(fileURLWithPath: path).appendingPathComponent(name)
        try! UIImagePNGRepresentation(self)?.write(to: url)
        print("saved image at \(url)")
    }
}

// Usage: Saves file in the Documents directory
image.save("climate_model_2017.png")
neoneye
quelle
6
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];

Dabei ist Pfad der Name der Datei, in die Sie sie schreiben möchten.

Maggie
quelle
4

Zuerst sollten Sie das Verzeichnis Dokumente abrufen

/* create path to cache directory inside the application's Documents directory */
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"fileName"];

Dann sollten Sie das Foto in der Datei speichern

NSData *photoData = UIImageJPEGRepresentation(photoImage, 1);
[photoData writeToFile:filePath atomically:YES];
lu Yuan
quelle
4

In Swift 4.2:

// Create path.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let filePath = paths.first?.appendingPathComponent("MyImageName.png") {
    // Save image.
    do {
       try image.pngData()?.write(to: filePath, options: .atomic)
    } catch {
       // Handle the error
    }
}
Torianin
quelle
2

In Swift 4:

// Create path.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let filePath = paths.first?.appendingPathComponent("MyImageName.png") {
    // Save image.
    do {
       try UIImagePNGRepresentation(image)?.write(to: filePath, options: .atomic)
    }
    catch {
       // Handle the error
    }
}
Samo
quelle