如何将UIImagePickerController获取的UIImage转为字符串存入Realm
你不需要修改封装好的ImagePicker类内部的didFinishPickingMediaWithInfo方法,该方法已经正确将选中的图片通过ImagePickerDelegate代理回调到业务层,直接在业务类中处理图片转字符串逻辑即可。
UIImage转字符串存入Realm通常有两种实现方案,可根据业务场景选择:
方案1:转Base64编码字符串存储
适合小尺寸图片存储,使用简单,无需处理本地文件管理,缺点是Base64编码后数据体积比原二进制大33%左右,不适合大图存储。
实现代码:
class AddPlaneImageController: AddPlaneImageView { // 新增全局变量存储选中的图片实例 var selectedImage: UIImage? var imagePicker: ImagePicker! override func viewDidLoad() { super.viewDidLoad() self.imagePicker = ImagePicker(presentationController: self, delegate: self) } @IBAction func showImagePicker(_ sender: UIButton) { self.imagePicker.present(from: sender) } @IBAction func saveButton(_ sender: Any) { // 校验图片存在、转JPEG数据,compressionQuality为压缩质量0~1,可按需调整 guard let image = selectedImage, let imageData = image.jpegData(compressionQuality: 0.8) else { // 无有效图片的异常处理逻辑自行补充 return } // 转Base64字符串 let imageBase64Str = imageData.base64EncodedString() // 存入Realm,aircompany字段请自行补充对应业务值 RealmModel.shared.addPlaneImage(planeImage: imageBase64Str, aircompany: "") } } extension AddPlaneImageController: ImagePickerDelegate { func didSelect(image: UIImage?) { self.planeImage.image = image // 存储选中的图片到全局变量 self.selectedImage = image } }
读取时Base64转回UIImage代码:
if let imageData = Data(base64Encoded: 从Realm取出的Base64字符串) { let targetImage = UIImage(data: imageData) }
方案2:图片写入沙盒存文件路径字符串
适合所有尺寸图片存储,性能更高,缺点需要自行管理本地图片文件。
实现代码:
首先新增图片写入沙盒的工具方法:
/// 把图片写入沙盒Documents目录,返回存储路径字符串 func saveImageToDocument(image: UIImage, fileName: String) -> String? { guard let imageData = image.jpegData(compressionQuality: 0.8) else { return nil } let docPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] let fullPath = (docPath as NSString).appendingPathComponent(fileName) do { try imageData.write(to: URL(fileURLWithPath: fullPath)) return fullPath } catch { print("图片存储失败: \(error)") return nil } }
修改saveButton的存储逻辑:
@IBAction func saveButton(_ sender: Any) { guard let image = selectedImage else { return } // 生成唯一文件名,避免重复,这里用时间戳举例 let fileName = "plane_img_\(Int(Date().timeIntervalSince1970)).jpg" guard let imagePath = saveImageToDocument(image: image, fileName: fileName) else { return } // 将路径字符串存入Realm RealmModel.shared.addPlaneImage(planeImage: imagePath, aircompany: "") }
读取时路径转回UIImage代码:
let targetImage = UIImage(contentsOfFile: 从Realm取出的文件路径字符串)
内容的提问来源于stack exchange,提问作者Artem Trefilov
相关产品推荐
相关产品推荐

