[iOS 10] UIGraphicsImageRenderer について
はじめに
こんにちは。モバイルアプリサービス部の平屋です。
本記事では iOS 10 で追加された UIGraphicsImageRenderer
クラスを使ってできることを紹介していきます。
UIGraphicsImageRenderer
クラスは、その名の通り画像を描画するためのクラスです。
実装
さっそく、UIGraphicsImageRenderer
クラスの使用例を見ていきます。
「色とサイズを指定して UIImage を生成するメソッド」を例に、UIGraphicsImageRenderer
クラスを使用する場合と使用しない場合の違いを比べてみます。
// 色とサイズを指定して UIImage を生成する func image(color: UIColor, size: CGSize) -> UIImage { // UIImage 生成処理 // ... }
UIGraphicsImageRenderer を使用しない場合
「コンテキスト生成」「描画」「コンテキスト終了」などの各処理を、順番に 1 ステップずつ記述します。
func image(color: UIColor, size: CGSize) -> UIImage { // ビットマッブコンテキストを生成 UIGraphicsBeginImageContext(size) // コンテキスト取得 let context = UIGraphicsGetCurrentContext() // 描画処理 context!.setFillColor(color.cgColor) // 色を指定 context!.fill(CGRect(origin: CGPoint.zero, size: size)) // 塗りつぶす // 描画された画像を取得 let image = UIGraphicsGetImageFromCurrentImageContext() // コンテキストを終了 UIGraphicsEndImageContext() return image! }
UIGraphicsImageRenderer を使用する場合
UIGraphicsImageRenderer
オブジェクトを作成し、image(actions:)
メソッドを使用して UIImage
を生成します。
描画処理のコードだけを actions
引数のブロックの中に記述します。開発者がコンテキストを管理する必要はありません。
func image(color: UIColor, size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) return renderer.image(actions: { rendererContext in // 描画処理 rendererContext.cgContext.setFillColor(color.cgColor) // 色を指定 rendererContext.fill(CGRect(origin: CGPoint.zero, size: size)) // 塗りつぶす }) }
余談
バイナリデータ作成
「UIGraphicsImageRenderer を使用する場合」では、UIGraphicsImageRenderer
の image(actions:)
メソッドを使用して UIImage
を生成するコードを紹介しました。
以下のメソッドを使用すれば、PNG または JPEG 形式のバイナリデータを作成できます。
pngData(actions:)
jpegData(withCompressionQuality:actions:)
関連クラス
以下の 2 つのクラスが UIGraphicsImageRenderer
に関連します。UIGraphicsRenderer
クラスは抽象基底クラスです。UIGraphicsPDFRenderer
は PDF の描画に特化したクラスです。
- UIGraphicsRenderer - UIKit | Apple Developer Documentation
- UIGraphicsPDFRenderer - UIKit | Apple Developer Documentation
さいごに
本記事では iOS 10 で追加された UIGraphicsImageRenderer
クラスを使ってできることを紹介しました。
UIGraphicsImageRenderer
クラスを使用すれば、画像を描画をするコードを書く時に、開発者は描画処理のコードだけに集中できるようになります。これは地味に嬉しいですね。