gpt4 book ai didi

swift - 在 Realm 中保存图像

转载 作者:搜寻专家 更新时间:2023-10-30 22:29:31 26 4
gpt4 key购买 nike

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

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)
}

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

asset.assetImage = UIImagePNGRepresentation(userPhoto.image!)! as NSData?

...

   try! myRealm.write
{
user.assetsList.append(asset)
myRealm.add(user)
}

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

我做错了什么?

附言对不起我的英语:)


经过一些操作后,我得到了这段代码。但它覆盖了我的图像。

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);
}

最佳答案

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

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

let image = UIImage(contentsOfFile: path as String)

if image == nil {
return UIImage()
} else{
return image
}
}

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

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
}

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

    @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
}

关于swift - 在 Realm 中保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com