質問: `UIImage`オブジェクトを`NSUserDefaults`に保存するために`NSData`型に変換しようとしています。 `UIImagePNGRepresentation` メソッドまたは `UIImageJPEGRepresentation` メソッドで PNGやJPEGの画像をそれぞれ`NSData`型に変換できるということなのですが、元の画像のフォーマットが不明といった場合など、PNGやJPEGといった指定はせずに`NSData`型に変換するにはどのようにすればよいのか教えて頂きたいと思います。 `NSKeyedArchiver.archivedDataWithRootObject` メソッドで`UIImage`(ファイル名から生成したものです)を変換してみたのですが正しくアーカイブされないようです。 よろしくお願い致します。
回答: なぜ`UIImage`を`NSKeyedArchiver`を利用しても保存できないのか?というと、これはリファレンスに答えがありますが、 > > A UIImage object is a high-level way to display image data. You can create images from files, from Quartz image objects, or from raw image data you receive. The UIImage class also offers several options for drawing images to the current graphics context using different blend modes and opacity values. > > > UIImage Class Reference > > > `UIImage`というのは、画像そのものではなく、`Quartz`の扱う画像オブジェクトやビットマップなどを扱うための手段を提供するクラスだからです。 元の画像のフォーマットが何であれ、ディスプレイに表示しているのであれば、その画像はピクセルの集まりとしてメモリに保持されています。 このピクセルデータへアクセスするには、`CGImage`を取得して、`CGDataProvider`を利用すればよいのですが、そのままディスクに保存するのは容量の無駄なので、あまり一般的ではないです(Windows Bitmapも連長圧縮はしています)。 なお、`UIImagePNGRepresentation()`などは`UIImage`が管理しているピクセルデータの圧縮処理を行ってくれますが、これらはメソッドではなく、UIKitが提供する関数です。