首页 > 解决方案 > CIstraightenFilter 为大输入返回空白图像

问题描述

我正在尝试使用核心图像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
}

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

问题:

编辑
根据评论中的要求:应用过滤器后,我只是从过滤器的结果中创建一个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)
    }
}

标签: swiftcore-image

解决方案


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

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


推荐阅读