将Core Image Filter(CIBumpDistortion)仅应用于图像的一部分+更改CIFilter的选择半径和强度

时间:2016-07-24 19:27:25

标签: ios objective-c swift core-image cifilter

我想复制此处显示的一些功能:

Screenshot of an app

所以我希望用户将CIBumpDistortion过滤器应用于图像并让他选择

1)他想要通过让他只是触摸图像上的相应位置来准确应用它

2a)圆圈选择的大小(上图中的第一个滑块)

2b)CIBumpDistortion过滤器的强度(上图中的第二个滑块)

我阅读了一些之前提出的问题,但它们并没有真正有用,而且有些解决方案听起来远非用户友好(例如裁剪所需的部分,然后将其重新应用到旧图像)。希望我不会立刻要求太多。 Objective-C是首选,但任何帮助/暗示都会非常受欢迎!提前谢谢!

3 个答案:

答案 0 :(得分:5)

我写了一个演示(iPad)项目,可以让你应用大多数支持的CIF过滤器。它询问每个过滤器所需的参数,并内置支持浮点值以及点和颜色。对于凹凸失真滤镜,它允许您选择中心点,半径和输入比例。

该项目名为CIFilterTest。您可以通过以下链接从Github下载项目:https://github.com/DuncanMC/CIFilterTest

应用程序中有相当多的内务管理功能可以支持使用任何支持的过滤器的通用功能,但它应该为您提供足够的信息来实现您自己的过滤器过滤器。

我设计的应用滤镜并使其渲染而不延伸到原始图像边界之外的方法是首先对设置为身份变换的图像(CIAffineClamp)应用钳制滤波器,获取该过滤器的输出并将其输入“目标”过滤器的输入(在这种情况下为凹凸失真过滤器),然后获取其输出并将其输入到裁剪过滤器(CICrop)中裁剪滤镜的边界设置为原始图像大小。

在示例项目中查找的方法在showImage

中称为ViewController.m

答案 1 :(得分:2)

您写道:

  

1)他想要通过让他只是触摸它来准确地应用它   图像上的相应位置

     

2a)圆圈选择的大小(上图中的第一个滑块)

     

2b)CIBumpDistortion过滤器的强度(第二个滑块)   上图)

好吧,CIBumpDistortion具有以下属性:

  • inputCenter是效果的中心
  • inputRadius是圈子选择的大小
  • inputScale是强度

西蒙

答案 2 :(得分:0)

显示凹凸:
您必须通过半径尺寸(在您的情况下为白色圆圈)传递图像上的位置(kCIInputCenterKey)

func appleBumpDistort(toImage currentImage: UIImage, radius : Float, intensity: Float) -> UIImage? {
    var context: CIContext = CIContext()
    let currentFilter = CIFilter(name: "CIBumpDistortion")    
    let beginImage = CIImage(image: currentImage)
    currentFilter.setValue(beginImage, forKey: kCIInputImageKey)


    currentFilter.setValue(radius, forKey: kCIInputRadiusKey)
    currentFilter.setValue(intensity, forKey: kCIInputScaleKey)
    currentFilter.setValue(CIVector(x: currentImage.size.width / 2, y: currentImage.size.height / 2), forKey: kCIInputCenterKey)

    guard let image = currentFilter.outputImage else { return nil }

    if let cgimg = context.createCGImage(image, from: image.extent) {
        let processedImage = UIImage(cgImage: cgimg)
        return processedImage
    }
    return nil
}