Bagaimana cara menyimpan UIImage ke file?


Jawaban:


129

Tentu saja Anda dapat membuat subfolder di folder dokumen aplikasi Anda. Anda biasa NSFileManagermelakukan itu.

Anda gunakan UIImagePNGRepresentationuntuk mengubah gambar Anda ke NSData dan menyimpannya ke disk.

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

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

Data Inti tidak ada hubungannya dengan menyimpan gambar ke disk.


Anda kehilangan semua informasi orientasi dengan menggunakan UIImagePNGRepresentation.

1
jadi bagaimana cara menyimpan gambar tanpa kehilangan informasi?
Pol

@Pol Anda dapat menyimpannya sebagai UIImageJPEGRepresentation atau memperbaiki orientasinya sendiri, berbagai solusi di tautan stackoverflow.com/questions/3554244/…
pengguna1210182

26

Di 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
Tidak lagi valid - Anda perlu menggunakan.write() throws
Andrew K


17

Hal di atas berguna, tetapi tidak menjawab pertanyaan Anda tentang cara menyimpan di subdirektori atau mendapatkan gambar dari UIImagePicker.

Pertama, Anda harus menentukan bahwa pengontrol Anda mengimplementasikan delegasi pemilih gambar, baik dalam file kode .m atau .h, seperti:

@interface CameraViewController () <UIImagePickerControllerDelegate>

@end

Kemudian Anda menerapkan metode imagePickerController: didFinishPickingMediaWithInfo: delegasi, di mana Anda bisa mendapatkan foto dari pemilih gambar dan menyimpannya (tentu saja, Anda mungkin memiliki kelas / objek lain yang menangani penyimpanan, tetapi saya hanya akan menunjukkan kodenya di dalam metode):

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

Jika Anda ingin menyimpan sebagai gambar JPEG, 3 baris terakhir adalah:

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

di mana path adalah nama file yang ingin Anda tulis.


4

Pertama, Anda harus mendapatkan direktori Dokumen

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

Maka Anda harus menyimpan foto tersebut ke file

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

4

Di 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

Di 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
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.