LoginSignup
38
37

More than 5 years have passed since last update.

Swift画像処理の基礎知識 〜iOS標準の画像クラス・フレームワーク〜

Last updated at Posted at 2016-10-03

概要

自作アプリで画像処理を色々行ったので基礎知識をまとめました。
本記事ではよく使う画像クラスとiOS標準で用意されている画像処理フレームワークの紹介をします。

環境

  • Xcode 7.3.1 (Swift 2.2)

画像クラス

この辺の画像クラスの違いがよくわかっておらず、とりあえず使っていたので違いをまとめました。

  • UIImage
    • UIKitフレームワークのクラス。
    • 主に既存の画像を使った処理を行う。
    • 長さや位置の指定は "point" 単位で行う
    • 主にviewとのやりとりに使用する
  • CGImage
    • CoreGraphicsフレームワークのクラス。
    • オリジナルの図形などを描画したいときに使用する。
    • 長さや位置の指定は "pixel" 単位で行う
    • 画像加工やピクセル単位の処理を行う場合はだいたいこいつを使う(IN/OUTがCGImageになる)。
  • CIImage
    • CoreImageフレームワークのクラス。
    • 画像にフィルタ/エフェクトをかけるときに使用する。

画像処理フレームワーク

CoreGraphicsフレームワーク

UIImageViewやUIImageなどの既存の画像を使った処理ではなく、オリジナルの図形などを描画したいときに使用する。
また、画像自体を加工したいときに使用する。
画像加工の例を下記に記す。

【切り抜き処理】

切り取り前
18b93269-b6b2-50a7-f598-eaf8a5c845dc.png

切り取り後
f464b371-bd36-e2c4-94f4-1df55301e093.png

【サンプルコード】

// 切り抜き処理 imageが元画像のUIImage。x,y,w,hがそれぞれ切り抜きたい画像範囲。
let cropRect  = CGRectMake(x, y, w, h)
let cropRef   = CGImageCreateWithImageInRect(image.CGImage, cropRect)
let cropImage = UIImage(CGImage: cropRef!)

この他にピクセル単位で色を取り出したり、画像を作成したり、図形を描画したりできる。
ピクセル単位の情報が抜き出せるので画像解析などをやろうと思えばできるが、画像解析をしたい場合はOpenCVを使用した方が良い。

CoreImageフレームワーク

画像に対して下記のようなフィルタをかけることができる。
フィルタの種類はiOS9でなんと170種類あるらしい。
フィルタリングの例を下記に記す。

【セピア】

efdcca55-674b-8255-af95-e69f6accc6cd.png

【サンプルコード】

// image が 元画像のUIImage
let ciImage:CIImage = CIImage(image:image);
let ciFilter:CIFilter = CIFilter(name: "CISepiaTone")
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(0.8, forKey: "inputIntensity")
let ciContext:CIContext = CIContext(options: nil)
let cgimg:CGImageRef = ciContext.createCGImage(ciFilter.outputImage, fromRect:ciFilter.outputImage.extent())

//image2に加工後のUIImage
let image2:UIImage? = UIImage(CGImage: cgimg, scale: 1.0, orientation:UIImageOrientation.Up)

CIFileterにフィルタ名を文字列で指定してインスタンスを作成する。(上記でいう"CISepiaTone")
valueをセットするものはセットして後は出力するだけ。
フィルタ名や指定する値は公式リファレンス(引用にURL記載)を参照すれば全て記載されているので、上記サンプルに当てはめるだけで大体動くと思われます。

このようなエフェクトを付与する他に画像の境界をシャープ(境界線をくっきりさせる)にすることもできる。
単純に画像のエフェクト自体を目的とする他に、上記CoreGraphicsやOpenCVでの画像処理・画像解析の精度を上げる為にこれらのフィルタリングを利用することができる。

引用:
・Qiita:[Swift] 画像のサムネイル生成(縮小&切り抜き)
http://qiita.com/taku/items/fb44d0bf10509d977bc0
・はてなブログ:【iOS9】Core Image の新機能:文字認識/追加フィルタ47種Add Star
http://d.hatena.ne.jp/shu223/20150622/1434924215
・Qiita:【iOS】【swift】たった数行で画像のフィルタ/エフェクトが実現できる超便利フレームワークCoreImage
http://qiita.com/kitanoow/items/2fd1c6dc415d7af769db
・AppleDeveloper:Core Image Filter Reference
https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CILanczosScaleTransform

38
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
37