【发布时间】: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
}
当我调试时,我可以看到image 和ciImg 都是有效的(如果我单击预览,我可以看到图像)。生成的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