【问题标题】:How to get URL from UIImage?如何从 UIImage 获取 URL?
【发布时间】:2017-03-26 23:39:00
【问题描述】:

我有一个 iOS 应用,用户可以通过两种方式获取图片:

  1. 从照片库中选择 (UIImagePickerController)

  2. 从定制的相机中点击它

这是我从自定义相机单击图像的代码(这是在名为 Camera 的自定义类中,它是 UIView 的子类)

func clickPicture(completion:@escaping (UIImage) -> Void) {

    guard let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo)  else { return }

    videoConnection.videoOrientation = .portrait
    stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in

        guard let buffer = sampleBuffer else { return }

        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer)
        let dataProvider = CGDataProvider(data: imageData! as CFData)
        let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)

        let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right)

        completion(image)


    })
}

这是我在ViewController 中单击图像的方式:

@IBAction func clickImage(_ sender: AnyObject) {
    cameraView.clickPicture { (image) in
        //use "image" variable
    }
}

稍后,我尝试使用CloudKit 将这张图片上传到用户的 iCloud 帐户。但是我收到一条错误消息,说记录太大。然后我遇到了this SO post,它说要使用CKAsset。但是,CKAsset 的唯一构造函数需要 URL

有没有一种通用的方法可以让我从任何UIImage 获得URL?否则,如何从我使用自定义相机单击的图像中获取URL(我见过其他posts 关于从UIImagePickerController 获取网址)?谢谢!

【问题讨论】:

  • 如何创建临时位置 URL?

标签: ios swift image url cloudkit


【解决方案1】:

CKAsset 代表一些外部文件(图像、视频、二进制数据等)。这就是为什么它需要URL 作为初始化参数。

在您的情况下,我建议使用以下步骤将大图像上传到 CloudKit:

  1. UIImage 保存到本地存储(例如文档目录)。
  2. 使用本地存储中图像的路径初始化CKAsset
  3. 将资产上传到云端。
  4. 上传完成后从本地存储中删除图像。

这里有一些代码:

// Save image.
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let filePath = "\(path)/MyImageName.jpg"

UIImageJPEGRepresentation(image, 1)!.writeToFile(filePath, atomically: true)

let asset = CKAsset(fileURL: NSURL(fileURLWithPath: filePath)!)
// Upload asset here.

// Delete image.
do {
    try FileManager.default.removeItem(atPath: filePath)
} catch {
    print(error)
}

【讨论】:

  • 感谢您的回复!但是,在将记录保存到 CloudKit 时出现以下错误:“没有这样的文件或目录”。这可能是什么原因造成的?
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多