奇怪的CoreImage裁剪问题在这里遇到

时间:2017-09-29 21:48:27

标签: ios core-graphics core-image

我有一个奇怪的问题,在我从照片库中裁剪照片后,无法从应用程序中显示。运行此代码后,它给了我这个错误:

        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不喜欢它。知道这个程度有什么用吗?

2 个答案:

答案 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))
}