Nếu tôi có một UIImage
imagePicker, làm cách nào để lưu nó vào một thư mục con trong thư mục tài liệu?
Nếu tôi có một UIImage
imagePicker, làm cách nào để lưu nó vào một thư mục con trong thư mục tài liệu?
Câu trả lời:
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.
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)
.write() throws
Bạn phải xây dựng biểu diễn hình ảnh của mình dưới dạng định dạng cụ thể (giả sử, JPEG hoặc PNG), sau đó gọi writeToFile:atomically:
biểu diễn:
UIImage *image = ...;
NSString *path = ...;
[UIImageJPEGRepresentation(image, 1.0) writeToFile:path atomically:YES];
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];
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")
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];
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
}
}
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
}
}