【Swift / iOSアプリ開発】画像を扱う! UIImage / CGImage / CIImage / Image (SwiftUI)なになに?どれがどれ?

iOS

UIImageとImage(SwiftUI)は表示とかなんだろうなとは思うのですがなかなか

回転させたいだけなのに!!!
意外と難しい。。。

撮影した写真の向きがおかしいと…なぜかportraitの向き(縦)で撮っているのに .right (3) になっている。しかし特別処理を加えなければ問題なくアルバムに保存できるという…
向きは変えたけど実際のデータは変わっていません!みたいな
編集やフィルターなど使っていると CGImage ( Core Graphics ) CIImage ( Core Image )などで操作するのですが、イメージはわかるのですがなんなんだ?と思いまとめてみます。

特徴CGImageUIImageCIImage
フレームワークCore GraphicsUIKitCore Image
対象低レベル画像処理高レベル画像操作・画面表示GPUを活用した画像フィルタやエフェクト
構造ピクセルデータの直接管理CGImageやCIImageを内包する高レベルなラッパーGPU処理用の参照型データ
画像データ実際のピクセルデータが存在実際のピクセルデータが存在または参照ピクセルデータではなく処理内容の情報を保持
主な用途ピクセル操作、画像の描画UIでの画像表示、簡単な加工処理フィルタ処理やリアルタイムのGPUレンダリング
パフォーマンス高速で軽量比較的遅い(内部処理が多い)高速(GPUの並列処理を活用)
リサイズ/クロップ自分で処理が必要簡単に利用可能特定のフィルタ(例: CICrop)で処理
柔軟性低い高い非常に高い(フィルタチェーンが可能)
データサイズ小さい(生のピクセルデータ)やや大きい(メタデータや複数形式のサポートを含む)小さい(必要な情報のみ保持)

使っていると実際に違うのでわかってはいるのですが、あれ?となることも

利用シーン推奨クラス理由
画像をUIに表示するUIImageUIKitで直接使えるため簡単。
ピクセル単位で画像を操作するCGImage低レベルで効率的に操作可能。
リアルタイムフィルタや加工CIImageCore Imageのフィルタチェーンで高速処理が可能。
クロップ・リサイズCGImageまたはUIImageCGImageは低レベル操作、UIImageは簡単に利用可能。
フィルタの適用CIImageCIFilterを使用した簡単かつ高速な処理が可能。
効率重視の大量画像処理CGImageメモリ効率がよく、複数の画像処理に向いている。

利用シーンを見るとほうほうと。今回のカメラアプリ、画像編集アプリでは CGImageで処理することが多いです。でもフィルターでシンプルに編集だけならCIImageも多用すると思います。

変換元 → 変換先コード例
UIImage → CGImageuiImage.cgImage
CGImage → UIImageUIImage(cgImage: cgImage)
UIImage → CIImageCIImage(image: uiImage)
CIImage → UIImageUIImage(ciImage: ciImage)
CGImage → CIImageCIImage(cgImage: cgImage)
CIImage → CGImageCIContext().createCGImage(ciImage, from: ciImage.extent)

ちょっとしたこともこの変換が必要なので?なんか効率悪い?となることもあるので気をつけたいところですね

特徴UIImageSwiftUIのImage
フレームワークUIKitSwiftUI
型の目的画像データの格納と操作画像の表示(データそのものは持たない)
画像データ実際のピクセルデータを保持表示に特化しており、参照するデータを指定する
作成方法UIImage(named: “example”)Image(“example”) (アセット名)
構造内部に CGImage や CIImage を持つ抽象化された表示用構造
用途UIKit の UI コンポーネントでの利用SwiftUI の UI コンポーネントでの利用
操作の可用性クロップやフィルタなどの画像操作が可能表示に特化し、画像操作は行わない
変換の必要性Core Graphics, Core Image, SwiftUI で使えるUIKit や Core Graphicsで使うには変換が必要

SwiftUIで画面開発しているのでどちらにしてもUIImageは使うという感じですね

慣れるまではこのあたり読み間違えもあるので?と思ったら一度確認してみたいところです!

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました