UIImagePickerController的图像是否可能没有CGImage值?

时间:2017-02-15 08:59:30

标签: ios swift uiimage uiimagepickercontroller cgimage

我正在尝试减少代码中的强制解包,但有时我也不想写if let次检查,如果没有必要的话。

我注意到我在代码的一个特定部分有大量的力量展开,用户可以用相机或手机库拍照,然后裁剪并压缩它。这是所有力量展开的过程:

  1. 我强制从imagePickerController(picker: didFinishPickingMediaWithInfo:)函数展开图片:

    let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage`
    

    我对此感到非常安全,因为我有imagePicker.mediaTypes = [kUTTypeImage as String]

  2. 我使用CGImageCreateWithImageInRect裁剪图像,其第一个参数是CGImage,我强制解包。这是我最大的假设,虽然我从来没有遇到过崩溃,但我仍然知道这不安全。

    let cgImage = CGImageCreateWithImageInRect(pickedImage.CGImage!, cropRect)
    let croppedImage = UIImage(CGImage: cgImage)
    
  3. 我使用返回UIImageJPEGRepresentation的{​​{1}},但如果图片没有NSData,则可能会返回nil。我也基于之前的假设强行打开它。

    CGImageRef
  4. 我通过强制解包再次创建结果图像,因为我认为let jpegData = UIImageJPEGRepresentation(croppedImage, 0.85) 不是jpegData

    nil
  5. TLDR:let resultImage = UIImage(data: jpegData)! 可能会返回没有UIImagePickerController的图片吗?如果是,我将在步骤1和2之间添加一个检查,以查看是否存在CGImage值。我还能安全地强行打开其他步骤吗?

2 个答案:

答案 0 :(得分:0)

是的,<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>的CGImage属性可以是UIImage

  

如果使用CIImage对象初始化UIImage对象,则该属性的值为NULL。

来源:https://developer.apple.com/reference/uikit/uiimage/1624147-cgimage

答案 1 :(得分:0)

UIImage =图像管理员(方向,大小,比例等)

CIImage =&#34;配方&#34;,不是原始图像,但有恢复它的工具(属性数组,颜色空间,URL(或像素缓冲区)视频)等。)

CGImage =原始

中的位图图像

是的,有时UIImage可以在没有cg的情况下出现。但为什么不查询&#39;配方&#39; 相反,尝试自己创建一个CG? 您有一个上下文和对“创建CGI图像”的调用。 :

if let cg = pickedImage!.cgImage {
    // you've got a CG :)
} else {
    // make CG yourself from CIImage
    if let ci = pickedImage!.ciImage {
        let context = CIContext()
        guard let cgImage = context.createCGImage(ci, from: ci.extent) else { return }
        let croppedImage = UIImage(cgImage: cgImage)    
    }
}