我正在尝试减少代码中的强制解包,但有时我也不想写if let
次检查,如果没有必要的话。
我注意到我在代码的一个特定部分有大量的力量展开,用户可以用相机或手机库拍照,然后裁剪并压缩它。这是所有力量展开的过程:
我强制从imagePickerController(picker: didFinishPickingMediaWithInfo:)
函数展开图片:
let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage`
我对此感到非常安全,因为我有imagePicker.mediaTypes = [kUTTypeImage as String]
。
我使用CGImageCreateWithImageInRect
裁剪图像,其第一个参数是CGImage
,我强制解包。这是我最大的假设,虽然我从来没有遇到过崩溃,但我仍然知道这不安全。
let cgImage = CGImageCreateWithImageInRect(pickedImage.CGImage!, cropRect)
let croppedImage = UIImage(CGImage: cgImage)
我使用返回UIImageJPEGRepresentation
的{{1}},但如果图片没有NSData
,则可能会返回nil
。我也基于之前的假设强行打开它。
CGImageRef
我通过强制解包再次创建结果图像,因为我认为let jpegData = UIImageJPEGRepresentation(croppedImage, 0.85)
不是jpegData
。
nil
TLDR:let resultImage = UIImage(data: jpegData)!
可能会返回没有UIImagePickerController
的图片吗?如果是,我将在步骤1和2之间添加一个检查,以查看是否存在CGImage
值。我还能安全地强行打开其他步骤吗?
答案 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)
}
}