Làm cách nào để lưu UIImage vào một tệp?


Câu trả lời:


129

Tất nhiên, bạn có thể tạo các thư mục con trong thư mục tài liệu của ứng dụng. Bạn sử dụng NSFileManagerđể làm điều đó.

Bạn sử dụng UIImagePNGRepresentationđể chuyển đổi hình ảnh của mình sang NSData và lưu vào đĩa.

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

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

Nhân tiện, Core Data không liên quan gì đến việc lưu hình ảnh vào đĩa.


Bạn mất tất cả thông tin định hướng khi sử dụng UIImagePNGRepresentation.

1
vậy làm cách nào để có thể lưu ảnh mà không bị mất thông tin?
Pol

@Pol, bạn có thể lưu nó dưới dạng UIImageJPEGRepresentation hoặc tự sửa định hướng, các giải pháp khác nhau trong liên kết stackoverflow.com/questions/3554244/…
user1210182

26

Trong 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
Không còn giá trị - bạn cần sử dụng.write() throws
Andrew K


17

Những điều trên rất hữu ích, nhưng chúng không trả lời câu hỏi của bạn về cách lưu vào thư mục con hoặc lấy hình ảnh từ UIImagePicker.

Trước tiên, bạn phải chỉ định rằng bộ điều khiển của bạn triển khai đại biểu của bộ chọn hình ảnh, trong tệp mã .m hoặc .h, chẳng hạn như:

@interface CameraViewController () <UIImagePickerControllerDelegate>

@end

Sau đó, bạn triển khai phương thức imagePickerController: didFinishPickingMediaWithInfo: của đại biểu, đó là nơi bạn có thể lấy ảnh từ bộ chọn ảnh và lưu nó (tất nhiên, bạn có thể có một lớp / đối tượng khác xử lý việc lưu, nhưng tôi sẽ chỉ hiển thị mã bên trong phương thức):

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

Nếu bạn muốn lưu dưới dạng ảnh JPEG, 3 dòng cuối cùng sẽ là:

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

trong đó đường dẫn là tên của tệp bạn muốn ghi nó vào.


4

Trước tiên, bạn sẽ nhận được thư mục Documents

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

Sau đó, bạn nên lưu ảnh vào tệp

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

4

Trong 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

Trong 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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.