在Realm中保存图像

Lio*_*man 5 realm swift

我正试图通过方法从设备的照片库中选择图像:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{

    userPhoto.image = info[UIImagePickerControllerOriginalImage] as! UIImage?
    userPhoto.contentMode = .scaleAspectFill
    userPhoto.clipsToBounds = true

    dismiss(animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

并将此图片保存在Realm中(作为NSData):

asset.assetImage = UIImagePNGRepresentation(userPhoto.image!)! as NSData?
Run Code Online (Sandbox Code Playgroud)

...

   try! myRealm.write
        {
            user.assetsList.append(asset)
            myRealm.add(user)
        }
Run Code Online (Sandbox Code Playgroud)

构建成功并尝试选择并保存图像(在应用程序中)我有应用程序错误:'二进制太大'

我做错了什么?

PS抱歉我的英文:)


经过一些动作我有这个代码.但它覆盖了我的形象.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    let imageUrl = info[UIImagePickerControllerReferenceURL] as! NSURL
    let imageName = imageUrl.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    let photoURL = NSURL(fileURLWithPath: documentDirectory)
    let localPath = photoURL.appendingPathComponent(imageName!)
    let image = info[UIImagePickerControllerOriginalImage]as! UIImage
    let data = UIImagePNGRepresentation(image)

    do
    {
        try data?.write(to: localPath!, options: Data.WritingOptions.atomic)
    }
    catch
    {
        // Catch exception here and act accordingly
    }

    userPhoto.image = image
    userPhoto.contentMode = .scaleAspectFill
    userPhoto.clipsToBounds = true

    urlCatch = (localPath?.path)!
    self.dismiss(animated: true, completion: nil);
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ann 9

不要将图像本身保存到域中,只需将图像的位置保存为字符串或NSString,然后从该保存的路径加载图像.性能方面,从该物理位置加载图像总是更好,而且数据库不会太大

  func loadImageFromPath(_ path: NSString) -> UIImage? {

        let image = UIImage(contentsOfFile: path as String)

        if image == nil {
            return UIImage()
        } else{
            return image
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者你只是保存图像名称,如果它在你的文件目录中无论如何

func loadImageFromName(_ imgName: String) -> UIImage? {

        guard  imgName.characters.count > 0 else {
            print("ERROR: No image name")
            return UIImage()
        }

        let imgPath = Utils.getDocumentsDirectory().appendingPathComponent(imgName)
        let image = ImageUtils.loadImageFromPath(imgPath as NSString)           
        return image    
    }
Run Code Online (Sandbox Code Playgroud)

这里有一个粗略的例子,说明如何使用唯一名称将捕获的图像保存到目录:

    @IBAction func capture(_ sender: AnyObject) {

        let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo)
            stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (imageDataSampleBuffer, error) -> Void in

                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                //self.stillImage = UIImage(data: imageData!)
                //self.savedImage.image = self.stillImage

                let timestampFilename = String(Int(Date().timeIntervalSince1970)) + "someName.png"

                let filenamePath =  URL(fileReferenceLiteralResourceName: getDocumentsDirectory().appendingPathComponent(timestampFilename))
                let imgData = try! imageData?.write(to: filenamePath, options: [])

            })



    /* helper get Document Directory */
    class func getDocumentsDirectory() -> NSString {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0]
        //print("Path: \(documentsDirectory)")
        return documentsDirectory as NSString
    }
Run Code Online (Sandbox Code Playgroud)


Vya*_*lav 5

https://realm.io/docs/objc/latest/#current-limitations 最大数据大小为 16 MB 。这是境界的限制