【问题标题】:Strange CoreImage cropping issues encounter here在这里遇到奇怪的 CoreImage 裁剪问题
【发布时间】:2017-09-29 21:48:27
【问题描述】:

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

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

更多信息:调试打印输入图像和校正图像的范围

self.inputImage的打印说明:CIImage: 0x1c42047a0 extent [0 0 3024 4032]>

作物 [430 3955 31 32] 范围=[430 3955 31 32] 仿射 [0 -1 1 0 0 4032] 范围=[0 0 3024 4032] 不透明 仿射 [1 0 0 -1 0 3024] 范围=[0 0 4032 3024] 不透明 颜色匹配“sRGB IEC61966-2.1”_to_workingspace 范围=[0 0 4032 3024] 不透明 IOSurface 0x1c4204790(501) 种子:1 YCC420f 601 alpha_one extent=[0 0 4032 3024] 不透明

有趣的是,当我使用 Xcode 放置断点时,我能够正确预览裁剪后的图像。我不确定 CIImage 的这个范围是什么,但是当我将裁剪的图像分配给它时,UIImageView 不喜欢它。知道这个 extent 的作用是什么吗?

【问题讨论】:

  • CoreImage 在无限平面上运行。范围是该平面中实际包含您关心的图像数据的矩形。
  • 如何更改范围??
  • 当我将它应用到 uiimageview 时它不会让我
  • 我不确定我是否与@KevinBallard 完全相同,但我创建了一个CIContext - 小心,这些很昂贵(阅读:创建一个需要处理时间),尝试做它一次并用于所有事情 - 然后我使用CIContext.createCGImage(CIImage, from: CIExtent),最后是UIImage(cgImage:)。我选择这种方法是因为我使用GLKView(使用GPU)而不是UIImageView(使用CPU)将内容渲染到屏幕上。 GLKView 不仅不需要UIImage,还存在一个正确编码的CIContext
  • 我重用了裁剪图像后给出的范围

标签: ios core-graphics core-image


【解决方案1】:

我遇到了你描述的同样的问题。由于 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 过于频繁;这是一项昂贵的手术。

【讨论】:

    【解决方案2】:

    您可以在 iOS 10.X 或更高版本中使用高级UIGraphicsImageRenderer 绘制图像。

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

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2021-05-12
      • 1970-01-01
      • 2013-02-09
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多