Swift图像处理之优化照片

Core Image能通过分析图片的各个属性,人脸的区域等进行自动优化图片。我们只需要调用autoAdjustmentFiltersWithOptions这个API方法获取各个自动增强滤镜来优化图片即可。不管是人物照片还是风景照均可增强效果。

(以前另外还有个叫autoAdjustmentFilters的方法,现已废除。)

1.具体使用的滤镜如下:

(1)CIRedEyeCorrection:修复因相机的闪光灯导致的各种红眼
(2)CIFaceBalance:调整肤色
(3)CIVibrance:在不影响肤色的情况下,改善图像的饱和度
(4)CIToneCurve:改善图像的对比度
(5)CIHighlightShadowAdjust:改善阴影细节

2.autoAdjustmentFiltersWithOptions方法参数说明(字典类型):

(1)CIDetectorImageOrientation提供图像方向:使Core Image能更精确的定位到脸的位置,对CIRedEyeCorrection和CIFaceBalance滤镜很有用。
(2)kCIImageAutoAdjustEnhance设为false :只需要消除红眼,不要其他滤镜
(3)kCIImageAutoAdjustRedEye设为false :消除红眼不要,其他滤镜都要

3.效果图如下(右侧为优化后的):

4.代码如下(所有滤镜都使用):

import UIKit
class ViewController: UIViewController{
  @IBOutlet weak var imageView: UIImageView!
  //图片原图
  lazy var originalImage: UIImage = {
    return UIImage(named: "IMG_0473.jpg")
  }()!
  lazy var context: CIContext = {
    return CIContext(options: nil)
    }()
  override func viewDidLoad() {
    super.viewDidLoad()
  }
  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
  //优化图片
  @IBAction func autoAdjustImage(sender: AnyObject) {
    var inputImage = CIImage(image: originalImage)
    let options:[String : AnyObject] = [CIDetectorImageOrientation:1] //图片方向
    let filters = inputImage!.autoAdjustmentFiltersWithOptions(options)
    //遍历所有滤镜,依次处理图像
    for filter: CIFilter in filters {
      filter.setValue(inputImage, forKey: kCIInputImageKey)
      inputImage = filter.outputImage
    }
    let cgImage = context.createCGImage(inputImage!, fromRect: inputImage!.extent)
    self.imageView.image = UIImage(CGImage: cgImage)
  }
  //还原图片
  @IBAction func resetImage(sender: AnyObject) {
     self.imageView.image = originalImage
  }
}

研究并自己敲一敲或者做成直接用的类是不错的选择.下面的地址不是写死的,加了拍照优化的功能,代码如下:(但是有一个BUG暂时无法解决,待解决了我再补充,大家自己用起来就知道在哪里了)

import UIKit
//从相册选取或者拍照需要实现UIImagePickerControllerDelegate UINavigationControllerDelegate
class ViewController: UIViewController ,UIImagePickerControllerDelegate,UINavigationControllerDelegate{
  @IBOutlet weak var imageView: UIImageView!
  var chooseImage: UIImage = UIImage()
  //图片原图
//  lazy var originalImage: UIImage = UIImage(named: "jobZ.png")!
//
//  lazy var context: CIContext = CIContext(options: nil)
  lazy var context: CIContext = {
    return CIContext(options: nil)
  }()
  override func viewDidLoad() {
//    self.imageView.image = UIImage(named: "jobZ.png")
  }
  //美化图片
  @IBAction func autoAdjustImage(sender: UIButton) {
    var inputImage = CIImage(image: self.chooseImage)
    let options:[String : AnyObject] = [CIDetectorImageOrientation:1] //图片方向
    let filters = inputImage!.autoAdjustmentFiltersWithOptions(options)
    //遍历所有滤镜,依次处理图像
    for filter: CIFilter in filters {
      filter.setValue(inputImage, forKey: kCIInputImageKey)
      inputImage = filter.outputImage
    }
    let cgImage = context.createCGImage(inputImage!, fromRect: inputImage!.extent)
    self.imageView.image = UIImage(CGImage: cgImage)
  }
  //选取图片
  @IBAction func chooseImage(sender: UIButton) {
    if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary){
      //初始化图片控制器
      let picker = UIImagePickerController()
      //设置代理
      picker.delegate = self
      //指定图片控制器类型 source我这里写的是用拍照,如果想用图库后面值改成UIImagePickerControllerSourceType.PhotoLibrary即可
      picker.sourceType = UIImagePickerControllerSourceType.Camera
      //如果有前置摄像头则调用前置摄像头
      if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front){
        picker.cameraDevice = UIImagePickerControllerCameraDevice.Front
      }
      //弹出控制器,显示界面
      self.presentViewController(picker, animated: true, completion: {
        () -> Void in
      })
    }else{
      print("读取相册错误")
    }
  }
  //还原图片
  @IBAction func resetImage(sender: UIButton) {
    self.imageView.image = self.chooseImage
  }
  //代理
  //选择图片成功后代理
  func imagePickerController(picker: UIImagePickerController,
    didFinishPickingMediaWithInfo info: [String : AnyObject]) {
      //查看info对象
      print(info)
      //获取选择的原图
      let image = info[UIImagePickerControllerOriginalImage] as! UIImage
      self.imageView.image = image
      self.chooseImage = image
      //图片控制器退出
      picker.dismissViewControllerAnimated(true, completion: {
        () -> Void in
      })
  }
}

此段代码运行效果如下:

(0)

相关推荐

  • Swift中动态调用实例方法介绍

    在 Swift 中有一类很有意思的写法,可以让我们不直接使用实例来调用这个实例上的方法,而是通过类型取出这个类型的某个实例方法的签名,然后再通过传递实例来拿到实际需要调用的方法.比如我们有这样的定义: 复制代码 代码如下: class MyClass {     func method(number: Int) -> Int {         return number + 1     } } 想要调用 method 方法的话,最普通的使用方式是生成MyClass的实例,然后用.method来

  • Swift教程之属性详解

    属性是描述特定类.结构或者枚举的值.存储属性作为实例的一部分存储常量与变量的值,而计算属性计算他们的值(不只是存储).计算属性存在于类.结构与枚举中.存储属性仅仅只在类与结构中. 属性通常与特定类型实例联系在一起.但属性也可以与类型本身联系在一起,这样的属性称之为类型属性. 另外,可以定义属性观察者来处理属性值发生改变的情况,这样你就可以对用户操作做出反应.属性观察者可以被加在自己定义的存储属性之上,也可以在从父类继承的子类属性之上. 1.存储属性 最简单的情形,作为特定类或结构实例的一部分,存

  • Swift中的可变参数函数介绍

    可变参数函数指的是可以接受任意多个参数的函数,我们最熟悉的可能就是 NSString 的 -stringWithFormat:方法了.在 Objective-C 中,我们使用这个方法生成字符串的写法是这样的: 复制代码 代码如下: NSString *name = @"Tom"; NSDate *date = [NSDate date]; NSString *string = [NSString stringWithFormat:                 @"Hell

  • Swift教程之闭包详解

    闭包(Closures)是独立的函数代码块,能在代码中传递及使用.Swift中的闭包与C和Objective-C中的代码块及其它编程语言中的匿名函数相似. 闭包可以在上下文的范围内捕获.存储任何被定义的常量和变量引用.因这些常量和变量的封闭性,而命名为"闭包(Closures)".Swift能够对所有你所能捕获到的引用进行内存管理. NOTE 假如你对"捕获(capturing)"不熟悉,请不要担心,具体可以参考Capturing Values(捕获值). 全局函数

  • Swift图像处理之优化照片

    Core Image能通过分析图片的各个属性,人脸的区域等进行自动优化图片.我们只需要调用autoAdjustmentFiltersWithOptions这个API方法获取各个自动增强滤镜来优化图片即可.不管是人物照片还是风景照均可增强效果. (以前另外还有个叫autoAdjustmentFilters的方法,现已废除.) 1.具体使用的滤镜如下: (1)CIRedEyeCorrection:修复因相机的闪光灯导致的各种红眼 (2)CIFaceBalance:调整肤色 (3)CIVibrance

  • Swift教程之集合类型详解

    Swift 提供两种集合类型来存储集合,数组和字典.数组是一个同类型的序列化列表集合.字典是一个能够使用类似于键的唯一标识符来获取值的非序列化集合. 在Swift中,数组和字典的键和值都必须明确它的类型.这意味这数组和字典不会插入一个错误的类型的值,以致于出错.这也意味着当你在数组和字典中取回数值的时候能够确定它的类型. Swift 使用确定的集合类型可以保证代码工作是不会出错,和让你在开发阶段就能更早的捕获错误. note: Swift的数组 储存不同的类型会展示出不同的行为,例如变量,常量或

  • Swift中图片资源使用流程的优化方法详解

    前言 去年发布的Xcode9支持在代码编辑中直接插入图片,类似如下效果 但用了一段时间以后还是不太喜欢,换回了原来的方法. 本篇中许多实现细节已经在 iOS中多语言本地化流程的优化中写过,没再重复,若有疑问建议先阅读该文章. 传统的方法 // iOS let closeImage = UIImage(named: "close") // macOS let closeImage = NSImage(named: NSImage.Name("close")) 是不是看

  • Swift使用SnapKit模仿Kingfisher第三方扩展优化

    目录 正文 SnapKit扩展方式简要思考 Kingfisher扩展方式简要思考 自行模仿尝试 最后 正文 我们平时用swift写第三方扩展(OC中的分类)时,可能会直接就往扩展里面写方法,简单又方便,然而当我们看一些常用你的三方(例如:Kingfisher.SnapKit)等,都会用一个简单的参数引出(例如:kf.snp),下面来探索一下怎么用的,然后在总结其优缺点 SnapKit扩展方式简要思考 以 SnapKit为例,使用如下,发现引入了 snp var iv = UIImageView(

  • Android Bitmap详解及Bitmap的内存优化

    Android Bitmap详解及Bitmap的内存优化 一.Bitmap: Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 常用方法: public void recycle() // 回收位图占用的内存空间,把位图标记为Dead public final boolean isRecycled() //判断位图内存是否已释放 public final int getWidth() //获取位图的

  • Swift语言与Applescript的区别?AppleScript的发展状况?

    本人为非开发人员(科研工作者),使用Mac,最近了解到Applescript对提高工作效率有很多帮助,希望学一下Applescript.不过最近10.10系统将发布,新的swift语言据说也能实现AppleScript的功能.我希望能了解Applescript最近的发展状况(Apple是否会逐渐淘汰这门语言),以及学习了swift是不是就不用学AppleScript了.希望高人解答,感谢大家 1.什么是applescript AppleScript是用在MacOSX上的脚本语言,和操作系统结合的

  • VMware虚拟机优化十招技巧

    在VMware虚拟机(VMware Workstation或VMware Server)中我们可以同时运行多个Guest OS,当同时在同一Host OS中运行多台虚拟机时势必会严重影响到Host OS的运行效率和性能.那么我们如何对虚拟机进行优化以达到最佳的资源利用率呢?在本文中向大家介绍10种目前通行的做法. 1.增加内存 在我看来,增加内存对Host OS及Guest OS的性能都有本质上的提升,而相对于CPU和磁盘来说内存的成本是最廉价的.通过增加内存,我们可以分配更多的内存给每个虚拟机

  • 批处理制作照片整理器第1/2页

    最近相机里的照片比较多,一般是连拍了好几天之后,才把相机里的照片一股脑放到硬盘里,并且是隔上一两个星期才整理一次.日子一长,照片就多了起来,都分不清是什么时候拍的了.网上搜索了很久,找到一款名为PhotosTool的软件,可以按拍摄日期来整理照片,正合我意,只可惜,这个不到1M的小软件,居然要另外安装20余M的.NET 2.0,一气之下,用P写了一个类似功能的脚本,发出来大家玩玩. 曾经有一段时间,单位资料室的电脑中毒很深,保存有数十G工作照片的分区也惨遭毒手--那可是我们单位几年工作的心血啊!

  • Java图像处理工具类

    本工具类的功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 复制代码 代码如下: package net.kitbox.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Re

  • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    迁移工作正好提供了一个重新审视现有 Objective-C 应用程序的机会,也可以通过 Swift 代码来更好的优化应用程序的体系架构,逻辑以及性能.直接的说,你将用先前学到的 mix and match 以及这两个语言间的互操作性来进行增量迁移工作.Mix-and-match 功能使得选择哪些特性和功能来用 Swift 来实现,哪些依然用 Objective-C 来实现变得简单.Swift 和 Objective-C 的互用性又使得将这些功能集成到 Objective-C 变得并不困难.通过这

随机推荐