2013/01/08更新

[XCODE] イメージをWebからダウンロードしてきて、base64で保存。base64からUIImageを作成する。

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、UIImage -> base64, base64 -> UIImageへそれぞれ変換する方法をブログに書きたいと思います。

画像



画像をbase64エンコーディングで保存する

Webサーバーからダウンロードしてきた画像を、UIImageとしてiPhoneアプリにキャッシュしたい場合に、 ファイル名など他の画像とかぶらないように決めて、FileSystemへ保存するのはちょっと面倒。
そんな時に、画像をBase64エンコーディングで文字列化し、それをDBやUserDefaultsなどへ保存すると便利な場合があります。

今回は、画像ファイルをBase64エンコードする方法と、Base64エンコードからUIImageを作成する方法を記載しました。



前準備

Base64エンコーディングは、そこまで難しいエンコードではないので自前で実装しても良いのですが、 Base64に変換してくれるコードがgithubに公開されているので、今回はそれを使います。

以下のNSData+Base64.hとNSData+Base64.mのファイルを利用します。
以下から各ファイルをダウンロードして、XCODE Projectに追加します。
(メモリ管理方法を自動にしている場合には、autoreleaseのコードなどを削除する必要があります)

- https://github.com/l4u/NSData-Base64


上記のコードは、NSDataの内容をBase64エンコーディングする実装内容のため、今回の画像の他に様々なバイナリーデータをBase64にすることが可能です。



UIImageの内容をBase64に変換する

今回は、各サイトのFavicon画像を取得して、Base64に変換して保存するという実装内容です。
以下のように実装します。

// NSDataにbase64変換するメソッドを追加する。
#import "NSData+Base64.h"

/* 途中省略 */

// google.comのFaviconをロードしてくる。
NSURL *url = [[NSURL alloc] initWithString:@"http://www.google.com/favicon.ico"];
NSError *error = nil;
NSData *data = [[NSData alloc] initWithContentsOfURL:url options:NSDataReadingUncached error:&error];
if (error) {
    // favicon取得処理でエラーが発生した場合には、処理を中止する。
    NSLog(@"/favicon.ico load failed. reason = %@", error);
	return;    
}
        
// ico -> png -> base64に変換する。
UIImage *icon = [UIImage imageWithData:data];
NSData *pngData = UIImagePNGRepresentation(icon);
NSString *base64String = [pngData base64EncodedString];
今回は、ファイル形式をPNGに統一して保存したかったので、途中でUIImagePNGRepresentation関数を挟んでいます。
これでBase64エンコードできた文字列が取得できました。



base64エンコードされた文字列からUIImage作成する

続いて、base64エンコード文字列からUIImageを作成します。
以下のように実装すると実現できます。

// base64エンコードされた画像データ
NSString *base64String = [pngData base64EncodedString];

// base64 -> UIImageへ変換する。
NSData *imageData = [NSData dataFromBase64String:base64String];
UIImage *icon = [UIImage imageWithData:imageData];

こちらもNSData+Base64.hで拡張されたNSDataクラスのメソッドを利用します。
こんな感じで簡単に実装することが可能です。



最後に

画像をFileSystemへ保存したり、NSArchiveを使ってDBにバイナリーデータとして保存することも可能ですが、 Base64で保存する選択肢も悪くないかなぁと思います。
データの保存形式の選択肢が多いと、より柔軟な実装ができて良いかもしれません。

簡単な内容ですが以上になります。最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。