Wie speichere ich ein UIImage in einer Datei?


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.


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)

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

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")

6
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];

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


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

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

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