2016-11-13 142 views
2

我有一个iOS应用程序,其中有2种方式,用户可以得到一个画面:如何从UIImage获取URL?

  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?否则,如何从我使用自定义相机单击的图像(我看到其他posts关于从UIImagePickerController获取网址)中获得URL?谢谢!

+0

我怎么会创建一个临时位置网址? – penatheboss

回答

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

感谢您的回复!但是,在将记录保存到CloudKit时,我正在获取以下错误:“没有这样的文件或目录”。什么可能导致这个? – penatheboss