図を作ってみました。
Appleの異なる画像処理フレームワーク(SwiftUI、UIKit、AppKit)間で画像データをやり取りする際のフロー図を示しています。
この図が示しているように、iOS や macOS で画像を扱う場合、複数の異なるフレームワーク(SwiftUI、UIKit、AppKit)間での画像データのやり取りが必要となることがよくあります。
しかし、それぞれのフレームワークは異なる画像型(UIKit では UIImage
、AppKit では NSImage
など)を使っているため、これらを統一して操作するのは煩雑です。
処理の煩わしさは以下の点にあります:
🧑🏻💻 異なる画像型の存在
UIKit、AppKit、Core Graphics などの各フレームワークはそれぞれ独自の画像データ型(UIImage
、NSImage
、CGImage
など)を使います。
異なる画像型を相互に変換する必要があり、そのための変換処理が増えてしまいます。
🧑🏻💻 変換処理の多さ
SwiftUI の Image
コンポーネントに画像を渡すには、UIKit の UIImage
や AppKit の NSImage
などの形式に適切に変換する必要があります。
例えば、UIImage
を SwiftUI に渡すために Image(uiImage:)
を使う必要があり、AppKit の NSImage
なら Image(nsImage:)
を使います。このように、変換手順が異なり、統一感に欠けます。
🧑🏻💻 データ型の制約と互換性
画像データをファイル形式(例えば、PNG や JPEG)に変換したり、ネットワークで送信する場合、Data 型を使う必要があります。
そのため、 UIImage.pngData()
や NSBitmapImageRep.representation(using:properties:)
のような変換処理を追加で行わなければなりません。
こうした一連の変換処理は単純な画像表示のために多くの余分なコードを必要とし、開発者にとって煩わしいと感じる要因です。
🧑🏻💻 フレームワーク間の相違点
UIKit は iOS 向け、AppKitは macOS 向けのフレームワークなので、同じアプリをクロスプラットフォームで開発する際に、これらのフレームワーク間の違いに対応しなければならず、異なる API や処理方法に習熟する必要があります。
総じて、このような画像の処理は、単純に画像を表示・変換・送信したいだけであっても多くの手順が必要となるため、効率的でないことが多いです。
これが処理の煩わしさにつながっています。
🧑🏻💻 SwiftUI
Image(uiImage:)
または Image(nsImage:)
を使って、それぞれ UIKit の UIImage
または AppKit の NSImage
を表示できます。
ImageRenderer(content:)
を使って、 UIImage
または NSImage
を作成することが可能です。
🧑🏻💻 UIKit の UIImage
SwiftUI の Image
や AppKit の NSImage
との間で画像の相互変換が可能です。
UIImage
は pngData()
でPNGフォーマットのデータに変換できますし、 UIImage(data:)
でデータから画像を生成できます。
🧑🏻💻 AppKit の NSImage
AppKit では NSImage.cgImage()
で Core Graphics の CGImage
を取得でき、NSBitmapImageRep
クラスを使って画像表現の変換が行われます。
NSBitmapImageRep
を通じて、NSImage
は、PNGなどの形式でエクスポート可能です。
🧑🏻💻 Core GraphicsのCGImage
UIKit の UIImage
や AppKitの NSImage
と互換性があり、それらを通じて画像を描画・変換する基盤を提供します。
🧑🏻💻 Foundation の Data
UIImage
や NSImage
から変換したデータ(例:PNG)を保持するデータ型。
これにより、画像データをファイルとして保存したり、ネットワークを通じて送信したりできます。
🧑🏻💻 したかったこと
AsyncImage
内での画像データの比較です。
302 リダイレクト後の画像を確認しています。
🧑🏻💻 まとめ
SwiftUI、UIKit、AppKit での画像処理は、それぞれのフレームワークが異なる画像形式を扱っているため、煩雑に感じることが多いです。
しかし、正しい変換手法を使い、CGImage
などを活用すれば互換性を確保できます。
さらに、最新の API を使いこなすことで、画像処理を効率的に行い、開発の手間を減らすことが可能です。
この記事で紹介したヒントを参考に、より快適な画像処理の開発を目指しましょう。