Bagaimana cara menyimpan UIImage ke file?

110

Jika saya memiliki UIImagedari imagePicker, bagaimana cara menyimpannya ke subfolder di direktori dokumen?

pengguna1542660
sumber

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.

DrummerB
sumber
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)
NatashaTheRobot
sumber
3
Tidak lagi valid - Anda perlu menggunakan.write() throws
Andrew K
25

Anda harus membuat representasi gambar Anda sebagai format tertentu (katakanlah, JPEG atau PNG), dan kemudian memanggil writeToFile:atomically:representasi tersebut:

UIImage *image = ...;
NSString  *path = ...;
[UIImageJPEGRepresentation(image, 1.0) writeToFile:path atomically:YES];
dasblinkenlight
sumber
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];
Alex si Ukraina
sumber
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
sumber
6
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];

di mana path adalah nama file yang ingin Anda tulis.

Maggie
sumber
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];
lu yuan
sumber
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
    }
}
Torianin
sumber
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
    }
}
Samo
sumber