我有一个奇怪的问题,在我从照片库中裁剪照片后,无法从应用程序中显示。运行此代码后,它给了我这个错误:
self.correctedImageView.image = UIImage(ciImage: correctedImage)
[api] - [CIContext(CIRenderDestination)_startTaskToRender:toDestination:forPrepareRender:error:]图像范围和目标范围不相交。
以下是我用于裁剪和显示的代码。 (inputImage是CIImage)
let imageSize = inputImage.extent.size let correctedImage = inputImage .cropped(to: textObvBox.boundingBox.scaled(to: imageSize) ) DispatchQueue.main.async { self.correctedImageView.image = UIImage(ciImage: correctedImage) }
更多信息:调试打印inputImage和correctedImage的范围
打印self.inputImage的描述:CIImage:0x1c42047a0范围[0 0 3024 4032]>
作物[430 3955 31 32]范围= [430 3955 31 32] 仿射[0 -1 1 0 0 4032] extent = [0 0 3024 4032]不透明 仿射[1 0 0 -1 0 3024]范围= [0 0 4032 3024]不透明 colormatch“sRGB IEC61966-2.1”_to_workingspace extent = [0 0 4032 3024]不透明 IOSurface 0x1c4204790(501)种子:1 YCC420f 601 alpha_one extent = [0 0 4032 3024] opaque
有趣的是,当我使用Xcode设置断点时,我能够正确预览裁剪后的图像。我不确定CIImage的这个范围是什么,但是当我将裁剪后的图像分配给它时,UIMageView不喜欢它。知道这个程度有什么用吗?
答案 0 :(得分:5)
我遇到了你描述的同样问题。由于UIKit / CoreImage中的一些奇怪行为,我需要先将CIImage
转换为CGImage
。我注意到只有当我将一些过滤器应用到CIImage
时才会发生这种情况,如下所述。
let image = /* my CIImage */
let goodImage = UIImage(ciImage: image)
uiImageView.image = goodImage // works great!
let image = /* my CIImage after applying 5-10 filters */
let badImage = UIImage(ciImage: image)
uiImageView.image = badImage // empty view!
这就是我解决它的方法。
let ciContext = CIContext()
let cgImage = self.ciContext.createCGImage(image, from: image.extent)
uiImageView.image = UIImage(cgImage: cgImage) // works great!!!
正如其他评论者所说,要注意经常创建CIContext
;这是一项昂贵的操作。
答案 1 :(得分:0)
您可以使用高级 UIGraphicsImageRenderer
在 iOS 10.X 或更高版本中绘制图像。
let img:CIImage = /* my ciimage */
let renderer = UIGraphicsImageRenderer(size: img.extent.size)
uiImageView.image = renderer.image { (context) in
UIImage(ciImage: img).draw(in: .init(origin: .zero, size: img.extent.size))
}