UIImageとImage(SwiftUI)は表示とかなんだろうなとは思うのですがなかなか
回転させたいだけなのに!!!
意外と難しい。。。
撮影した写真の向きがおかしいと…なぜかportraitの向き(縦)で撮っているのに .right (3) になっている。しかし特別処理を加えなければ問題なくアルバムに保存できるという…
向きは変えたけど実際のデータは変わっていません!みたいな
編集やフィルターなど使っていると CGImage ( Core Graphics ) CIImage ( Core Image )などで操作するのですが、イメージはわかるのですがなんなんだ?と思いまとめてみます。
特徴 | CGImage | UIImage | CIImage |
フレームワーク | Core Graphics | UIKit | Core Image |
対象 | 低レベル画像処理 | 高レベル画像操作・画面表示 | GPUを活用した画像フィルタやエフェクト |
構造 | ピクセルデータの直接管理 | CGImageやCIImageを内包する高レベルなラッパー | GPU処理用の参照型データ |
画像データ | 実際のピクセルデータが存在 | 実際のピクセルデータが存在または参照 | ピクセルデータではなく処理内容の情報を保持 |
主な用途 | ピクセル操作、画像の描画 | UIでの画像表示、簡単な加工処理 | フィルタ処理やリアルタイムのGPUレンダリング |
パフォーマンス | 高速で軽量 | 比較的遅い(内部処理が多い) | 高速(GPUの並列処理を活用) |
リサイズ/クロップ | 自分で処理が必要 | 簡単に利用可能 | 特定のフィルタ(例: CICrop)で処理 |
柔軟性 | 低い | 高い | 非常に高い(フィルタチェーンが可能) |
データサイズ | 小さい(生のピクセルデータ) | やや大きい(メタデータや複数形式のサポートを含む) | 小さい(必要な情報のみ保持) |
使っていると実際に違うのでわかってはいるのですが、あれ?となることも
利用シーン | 推奨クラス | 理由 |
画像をUIに表示する | UIImage | UIKitで直接使えるため簡単。 |
ピクセル単位で画像を操作する | CGImage | 低レベルで効率的に操作可能。 |
リアルタイムフィルタや加工 | CIImage | Core Imageのフィルタチェーンで高速処理が可能。 |
クロップ・リサイズ | CGImageまたはUIImage | CGImageは低レベル操作、UIImageは簡単に利用可能。 |
フィルタの適用 | CIImage | CIFilterを使用した簡単かつ高速な処理が可能。 |
効率重視の大量画像処理 | CGImage | メモリ効率がよく、複数の画像処理に向いている。 |
利用シーンを見るとほうほうと。今回のカメラアプリ、画像編集アプリでは CGImageで処理することが多いです。でもフィルターでシンプルに編集だけならCIImageも多用すると思います。
変換元 → 変換先 | コード例 |
UIImage → CGImage | uiImage.cgImage |
CGImage → UIImage | UIImage(cgImage: cgImage) |
UIImage → CIImage | CIImage(image: uiImage) |
CIImage → UIImage | UIImage(ciImage: ciImage) |
CGImage → CIImage | CIImage(cgImage: cgImage) |
CIImage → CGImage | CIContext().createCGImage(ciImage, from: ciImage.extent) |
ちょっとしたこともこの変換が必要なので?なんか効率悪い?となることもあるので気をつけたいところですね
特徴 | UIImage | SwiftUIのImage |
フレームワーク | UIKit | SwiftUI |
型の目的 | 画像データの格納と操作 | 画像の表示(データそのものは持たない) |
画像データ | 実際のピクセルデータを保持 | 表示に特化しており、参照するデータを指定する |
作成方法 | UIImage(named: “example”) | Image(“example”) (アセット名) |
構造 | 内部に CGImage や CIImage を持つ | 抽象化された表示用構造 |
用途 | UIKit の UI コンポーネントでの利用 | SwiftUI の UI コンポーネントでの利用 |
操作の可用性 | クロップやフィルタなどの画像操作が可能 | 表示に特化し、画像操作は行わない |
変換の必要性 | Core Graphics, Core Image, SwiftUI で使える | UIKit や Core Graphicsで使うには変換が必要 |
SwiftUIで画面開発しているのでどちらにしてもUIImageは使うという感じですね
慣れるまではこのあたり読み間違えもあるので?と思ったら一度確認してみたいところです!
コメント