【问题标题】:Output of CIFilter has different effect for different sizes of same imageCIFilter的输出对于同一图像的不同尺寸有不同的效果
【发布时间】:2019-08-06 08:08:55
【问题描述】:
func getImageWithFilter(by filterType: MainViewModel.FilterType,
    image: CIImage) -> CIImage {

    guard filterType.filterEnabled,
        let filter = CIFilter(name: filterType.rawValue)
    else {
        return image
    }
    filter.setValue(image, forKey: kCIInputImageKey)

    return filter.outputImage ?? image
}

我有两个输出:

  • 用于预览的 AVCaptureVideoDataOutput
  • AVCapturePhotoOutput 用于以高分辨率保存照片。

应用过滤器后,我得到不同的结果

请帮我解决这个问题。

【问题讨论】:

    标签: avfoundation avcapturesession cifilter avcapture avcapturevideodataoutput


    【解决方案1】:

    发生这种情况是因为内置 Core Image 过滤器的大多数参数都以像素为基础进行操作。在您的情况下,它是 CICrystallize 过滤器的 inputRadius 参数。来自文档:

    半径决定了使用多少像素来创建效果。半径越大,生成的晶体越大。

    这意味着您需要根据输入大小将参数设置为不同的值。

    我通常会计算某种因子,然后乘以我的​​基本参数值。例如:

    let inputSizeFactor = min(inputImage.size.width, inputImage.size.height) / 1000
    let scaledRadius = radius * inputSizeFactor
    filter.setValue(scaledRadius, forKey: "inputRadius")
    

    【讨论】:

    • 谢谢!它非常适合 CICrystallize。你能告诉我 CIGaussianBlur 和 CIComicEffect 的参数吗?
    • 没问题。您可以在cifilter.io 上轻松找到它们。对于CIGaussianBlur 也是inputRadius,但CIComicEffect 实际上没有任何参数。所以我猜你唯一的选择是在应用效果之前将图像缩放到所需的大小,然后再将其缩小(在此过程中会失去一些质量)。
    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2015-09-16
    • 2019-08-23
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多