You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:45:07