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
}
当我调试时,我可以看到 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)
}
}
您可以向 CIContext
询问其 inputImageMaximumSize()
。在我的测试中,这是 8192 x 8192,因此几乎不匹配您提供的示例大小。 但是 Core Image 可能需要在计算期间创建可能需要大于输入的中间缓冲区(这应该是 CIStraightenFilter
的情况)。我想这会超过上述限制。所以你可能需要先缩小图像。
顺便说一句:当您在调试器中使用“快速查看”检查 CIImage
时,Xcode 会在那个时刻 为您呈现该图像使用 CIContext
。在渲染之前,CIImage
只是创建图像的“配方”。这就是为什么当您在调试器中检查它时它也显示为空的原因。
我正在尝试使用核心图像 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
}
当我调试时,我可以看到 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)
}
}
您可以向 CIContext
询问其 inputImageMaximumSize()
。在我的测试中,这是 8192 x 8192,因此几乎不匹配您提供的示例大小。 但是 Core Image 可能需要在计算期间创建可能需要大于输入的中间缓冲区(这应该是 CIStraightenFilter
的情况)。我想这会超过上述限制。所以你可能需要先缩小图像。
顺便说一句:当您在调试器中使用“快速查看”检查 CIImage
时,Xcode 会在那个时刻 为您呈现该图像使用 CIContext
。在渲染之前,CIImage
只是创建图像的“配方”。这就是为什么当您在调试器中检查它时它也显示为空的原因。