CIStraightenFilter returns 大输入的空白​​图像

CIStraightenFilter returns a blank image for large input

我正在尝试使用核心图像 CIStraightenFilter 过滤器拉直 iOS 上的图像。输入图像可能非常大,例如 8192 x 4096 像素。当我运行对大图进行滤镜时,生成了结果图,但是原始值都是0,所以图片是black/transparent。这不会发生在较小的图像上,比如 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,但没有任何颜色信息。

问题:

编辑
根据评论中的要求:应用过滤器后,我只是根据过滤器的结果创建一个 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 询问其 inputImageMaximumSize()。在我的测试中,这是 8192 x 8192,因此几乎不匹配您提供的示例大小。 但是 Core Image 可能需要在计算期间创建可能需要大于输入的中间缓冲区(这应该是 CIStraightenFilter 的情况)。我想这会超过上述限制。所以你可能需要先缩小图像。

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