

`UIImage`オブジェクトを`NSUserDefaults`に保存するために`NSData`型に変換しようとしています。  
`UIImagePNGRepresentation` メソッドまたは `UIImageJPEGRepresentation` メソッドで  
PNGやJPEGの画像をそれぞれ`NSData`型に変換できるということなのですが、元の画像のフォーマットが不明といった場合など、PNGやJPEGといった指定はせずに`NSData`型に変換するにはどのようにすればよいのか教えて頂きたいと思います。

`NSKeyedArchiver.archivedDataWithRootObject`
メソッドで`UIImage`（ファイル名から生成したものです）を変換してみたのですが正しくアーカイブされないようです。

よろしくお願い致します。


CC BY-SA 3.0
2015-10-10T01:35:34.583
17487
2015-10-10T16:25:06.733
2015-10-10T11:58:53.713
5337
12701
question
swift xcode uiimage uikit
UIImage → NSData への変換についての疑問


UIImageをPNG形式のデータにするときにUIImagePNGRepresentation()を、JPEG形式のデータにするときにUIImageJPEGRepresentation()を使用します。元の画像フォーマットを気にする必要はありません。

具体的にはこんな感じになります。  
（Xcode 7.0.1で確認）

[code]

    // 何らかの形でUIImageを用意
    let image = UIImage(named: "pic01")!
    
    // PNG形式の画像フォーマットとしてNSDataに変換
    if let data = UIImagePNGRepresentation(image) {
    
        // dataを保存する
    
    }
    
[/code]

余談ですが、UIImageをNSUserDefaultsに保存するのはあまりおすすめ出来ません。


CC BY-SA 3.0
2015-10-10T05:49:25.157
17499
2015-10-10T05:49:25.157
7459
17487
answer


なぜ`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](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/)

`UIImage`というのは、画像そのものではなく、`Quartz`の扱う画像オブジェクトやビットマップなどを扱うための手段を提供するクラスだからです。

元の画像のフォーマットが何であれ、ディスプレイに表示しているのであれば、その画像はピクセルの集まりとしてメモリに保持されています。

このピクセルデータへアクセスするには、`CGImage`を取得して、[`CGDataProvider`](https://developer.apple.com/library/prerelease/ios/documentation/GraphicsImaging/Reference/CGDataProvider/index.html)を利用すればよいのですが、そのままディスクに保存するのは容量の無駄なので、あまり一般的ではないです（Windows
Bitmapも連長圧縮はしています）。

* * *

なお、`UIImagePNGRepresentation()`などは`UIImage`が管理しているピクセルデータの圧縮処理を行ってくれますが、これらはメソッドではなく、[UIKitが提供する関数](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/)です。


CC BY-SA 3.0
2015-10-10T12:23:09.737
17504
2015-10-10T12:23:09.737
5337
17487
answer