iOS8 Core Image In Swift:更复杂的滤镜

本文介绍了如何在Swift中利用iOS8的Core Image框架进行更复杂的滤镜操作,包括动态改变滤镜参数、创建老电影效果、子类化CIFilter以及简单抠图更换背景。通过示例代码详细展示了如何实现滤镜的组合和自定义,如CISepiaTone、CIColorMatrix等滤镜的使用,以及如何通过CIColorInvert自定义滤镜来反转颜色。
摘要由CSDN通过智能技术生成

iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用

iOS8 Core Image In Swift:更复杂的滤镜

iOS8 Core Image In Swift:人脸检测以及马赛克

iOS8 Core Image In Swift:视频实时滤镜


上面那篇文章主要是Core Image的基础,只是为了说明CIImage、CIFilter、CIContext,以及基础滤镜的简单使用。在上一篇中几乎没有对滤镜进行更复杂的操作,都是直接把inputImage扔给CIFilter而已,而Core Image实际上还能对滤镜进行更加细粒度的控制,我们在新的工程中对其进行探索。为此,我重新建立了一个空的workspace,并把之前所使用的工程添加到这个workspace中,编译、运行,没问题的话我们就开始创建新的工程。

通过workspace左下角的Add Files to添加已有的工程文件(xx.xcodeproj):



当添加工程到workspace的时候,记得要把被添加的工程关掉,不然workspacce不能识别。
另外,在流程上这篇也会与上一篇不同,上一篇一开始我就给出了代码,然后先看效果再步步为营,这篇不会在一开始给出代码。



动态改变滤镜参数的值

用Single View Application的工程模板建立一个新的工程,在View上放一个UIImageView,还是同样的frame,同样的ContentMode设置为Aspect Fit,同样的关闭Auto Layout以及Size Classes,最后把上个工程中使用的图片复制过来,在这个工程中同样使用这张图。

做完上面这些基础工作后,我们回到VC中,把showFiltersInConsole方法从上个工程中复制过来,然后在viewDidLoad里调用,在运行之前我们先看看Core Image有哪些类别,毕竟全部的滤镜有127种,不可能一一用到的。

类别有很多,而且我们从上一篇中知道了滤镜可以同时属于不同的类别,除此之外,类别还分为两大类:

按效果分类:

  • kCICategoryDistortionEffect 扭曲效果,比如bump、旋转、hole
  • kCICategoryGeometryAdjustment 几何开着调整,比如仿射变换、平切、透视转换
  • kCICategoryCompositeOperation 合并,比如源覆盖(source over)、最小化、源在顶(source atop)、色彩混合模式
  • kCICategoryHalftoneEffect Halftone效果,比如screen、line screen、hatched
  • kCICategoryColorAdjustment 色彩调整,比如伽马调整、白点调整、曝光
  • kCICategoryColorEffect 色彩效果,比如色调调整、posterize
  • kCICategoryTransition 图像间转换,比如dissolve、disintegrate with mask、swipe
  • kCICategoryTileEffect 瓦片效果,比如parallelogram、triangle
  • kCICategoryGenerator 图像生成器,比如stripes、constant color、checkerboard
  • kCICategoryGradient 渐变,比如轴向渐变、仿射渐变、高斯渐变
  • kCICategoryStylize 风格化,比如像素化、水晶化
  • kCICategorySharpen 锐化、发光
  • kCICategoryBlur 模糊,比如高斯模糊、焦点模糊、运动模糊

按使用场景分类:

  • kCICategoryStillImage 能用于静态图像
  • kCICategoryVideo 能用于视频
  • kCICategoryInterlaced 能用于交错图像
  • kCICategoryNonSquarePixels 能用于非矩形像素
  • kCICategoryHighDynamicRange 能用于HDR
这些专业词太难翻译了,有不准确的地方还望告知

此外还有我们之前用到的 kCICategoryBuiltIn
我们把 kCICategoryColorAdjustment这个类别下的滤镜打印出来看看:


有11个滤镜,其中有一个 CIHueAdjust,这个看名字应该是修改图像色调的,效果应该会比较明显,看看它有哪些参数:


它的详细信息里除了我们之前了解的inputImage和所属分类信息以外,多了个 inputAngle,显然这是一个输入参数,而且这个参数也打印的非常清晰,其中包括了:
  • 参数类型:NSNumber
  • 默认值:0
  • kCIAttributeIdentity:虽然这个值大部分情况下与默认值是一样的,但是它们的含义不一样,kCIAttributeIdentity表示的含义是这个值被应用到参数上的时候,就表示被应用的参数不会对inputImage造成任何影响
  • 最大值:Ԉ
  • 最小值:
  • 属性类型:角度
上面的这些参数以及取值对不同的CIFilter来说都不一样,要具体情况具体分析。
了解了以上情况后,我们就可以开始编码了。首先在VC里添加上个工程中的常用属性:

class ViewController: UIViewController {

    @IBOutlet var imageView: UIImageView!

    @IBOutlet var slider: UISlider!

    lazy var originalImage: UIImage = {

        return UIImage(named: "Image")

    }()

    

    lazy var context: CIContext = {

        return CIContext(options: nil)

    }()

    

    var filter: CIFilter!

......

与之前工程中不同的是,我多加了一个UISlider,Main.storyboard中VC的view像这样:

把UIImageView及UISlider的连线与VC中的连接起来,然后我们在viewDidLoad方法里写上: 

override func viewDidLoad() {

    super.viewDidLoad()

    

    imageView.layer.shadowOpacity = 0.8

    imageView.layer.shadowColor = UIColor.blackColor().CGColor

    imageView.layer.shadowOffset = CGSize(width: 1, height: 1)

    

    slider.maximumValue = Float(M_PI)

    slider.minimumValue = Float(-M_PI)

    slider.value = 0

    slider.addTarget(self, action: "valueChanged", forControlEvents: UIControlEvents.ValueChanged)


    let inputImage = CIImage(image: originalImage)

    filter = CIFilter(name: "CIHueAdjust")

    filter.setValue(inputImage, forKey: kCIInputImageKey)

    slider.sendActionsForControlEvents(UIControlEvents.ValueChanged)

    

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值