swift - 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)
}
}
解决方案
您可以CIContext
向其索取inputImageMaximumSize()
. 在我的测试中,这是 8192 x 8192,因此与您提供的示例尺寸几乎不匹配。但是,Core Image 可能需要在计算期间创建可能需要大于输入的中间缓冲区(这应该是这种情况CIStraightenFilter
)。我想这将超过上述限制。所以你可能需要先缩小图像。
顺便说一句:当您使用 Quick LookCIImage
在调试器中检查 a 时,Xcode 将在那个时刻使用CIContext
. 在渲染之前,aCIImage
只是创建图像的“配方”。这就是为什么当您在调试器中检查它时它也显示为空的原因。
推荐阅读
- sql - 如何在查询结果中用注释替换标题?
- sql-server - 如何将格式为“/”的日期列转换为格式“-”?
- python - 不更新 Python3 的变量
- php - 检查与 MariaDB 服务器版本相对应的手册,以了解在第 1 行的“.tcet@gmail.com”附近使用的正确语法”
- git - 从拉取请求中的提交安装 npm 包
- java - 创建方阵
- bitbucket-pipelines - bitbucket 管道中是否有 if-else 块?
- blazor - 适用于企业的 Blazor 托管模型
- php - AngularJs 中 PHP 的 net::ERR_EMPTY_RESPONSE
- angular - Cordova:在 Angular 8 延迟加载实施后,应用程序无法启动,并且在初始屏幕显示白屏后