【问题标题】:CIStraightenFilter returns a blank image for large inputCIstraightenFilter 为大输入返回空白图像
【发布时间】:2020-07-23 16:58:18
【问题描述】:

我正在尝试使用核心图像CIStraightenFilter 过滤器在 iOS 上拉直图像。输入图像可能非常大,例如 8192 x 4096 像素。当我在大图像上运行过滤器时,会生成结果图像,但原始值都是 0,因此图像是黑色/透明的。这不会发生在较小的图像上,比如 1024 x 512。

我的代码是:

func straighten(image: UIImage, by rotationAngle: Measurement<UnitAngle>) -> CIImage?
{
    guard let ciImg = CIImage(image: image) else { return nil }
    let rotationInRadians = CGFloat(rotationAngle.converted(to: .radians).value)
    
    let filter = CIFilter(name: "CIStraightenFilter")!
    filter.setValue(ciImg, forKey: kCIInputImageKey)
    filter.setValue(rotationInRadians, forKey: kCIInputAngleKey)
            
    return filter.outputImage
}

当我调试时,我可以看到imageciImg 都是有效的(如果我单击预览,我可以看到图像)。生成的CIImage 不是nil,但没有任何颜色信息。

问题:

  • 我可以通过滤镜的图像大小是否有任何限制?
  • 我现在可以为大图像做什么?

编辑
根据 cmets 中的请求:应用过滤器后,我只是从过滤器的结果中创建一个 CGImage(然后是一个 UIImage)。然后该图像也是空白的。

if let ciStraightened = straighten(image: inputImage, by: Measurement<UnitAngle>(value: angle, unit: .degrees)
{
    let ctx = CIContext(options:nil)
    if let cgImg = ctx.createCGImage(ciStraightened, from: ciStraightened.extent)
    {
        return UIImage(cgImage: cgImg)
    }
}

【问题讨论】:

  • 你好托尔斯滕。你能展示一下你之后对图像做了什么吗?你如何使用它?你是用CIContext 渲染它吗?
  • @FrankSchlegel 我已经用请求的信息更新了这个问题。奇怪的是,如果我在let ctx = CIContext... 行上放置一个断点,然后按“眼睛”按钮检查ciStraightened 变量,图像已经是空白的,所以问题似乎不是后面的代码过滤图像,但过滤器本身。正如问题中所说,上面的代码适用于较小的图像。

标签: swift core-image


【解决方案1】:

您可以向CIContext 询问其inputImageMaximumSize()。在我的测试中,这是 8192 x 8192,因此与您提供的示例尺寸几乎不匹配。 但是Core Image 可能需要在计算期间创建中间缓冲区,这可能需要大于输入(CIStraightenFilter 应该是这种情况)。我想这将超过上述限制。所以你可能需要先缩小图像。

顺便说一句:当您在调试器中使用 Quick Look 检查 CIImage 时,Xcode 将使用 CIContext 为您呈现该图像在那一刻。在渲染之前,CIImage 只是创建图像的“配方”。这就是为什么当您在调试器中检查它时它也显示为空的原因。

【讨论】:

  • 嗯,听起来很合理,尤其是。因为拉直滤镜会放大图像。但是如果我希望滤波器的输出为 8192 x 4096 怎么办?我必须a)提前计算结果的大小并缩小源,使旋转不超过8192 x 8192(我该怎么做?)和b)我必须将结果放大到又是 8192 x 4096,这降低了质量。
  • 也许您可以使用VNDetectHorizonRequest 来获得旋转图像所需的角度,然后使用 Core Graphics 或 Accelerate(在 CPU 上)以全分辨率旋转图像...
  • 感谢您的建议 - 我实际上仅使用 UIImage 实现了自己的矫直算法。足够快满足我的需要:-)
猜你喜欢
  • 2015-10-28
  • 2014-03-27
  • 2012-06-03
  • 1970-01-01
  • 2015-02-23
  • 2022-11-12
  • 2022-01-06
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多