電子ガジェットいろいろ

電子系のガジェットやアプリ開発等の話題を書いてます

iPhone SDK でUIImageの画像をSQLiteのDBに格納する方法

UIImageに格納された画像のバイナリイメージをSQLiteのDBに保存をする方法

SQLiteの使い方はiPhoneSDKでSQLiteを使う方法に書いてあります。

サンプルとして使うテーブル

サンプルとして以下のようなテーブルを定義して、格納します。
バイナリデータを格納する項目はblobで定義します。

create table IMAGETABLE (
    id integer,      // なんとなくID
    size integer,    // データサイズ
    data blob        // バイナリデータ
);

画像データの格納

UIImageのインスタンスメソッドのUIImagePNGRepresentationを使ってNSDataのインスタンスに変換してから、バイト配列としてテーブルに書き込みます。
画質よりサイズを優先するならば、UIImageJPEGRepresentationでもかまいません。

// 画像データはsampleimage(UIImage型)に格納されているとします。
NSData *imagedata = [[NSData alloc] initWithData:UIImagePNGRepresentation(sampleimage)];
// SQL
char *sqlImageInsert = "insert into IMAGETABLE values(?,?,?)";
// クエリの実行方法等は別のエントリー"iPhoneSDKでSQLiteを使う方法(http://d.hatena.ne.jp/uosoft/20090619/1245341478)"参照
if(sqlite3_prepare_v2(database, sqlImageInsert, -1, &statement, NULL) == SQLITE_OK) {
    // この場合、idは適当
    sqlite3_bind_int(statement, 1, 1);
    // NSDataのインスタンスメソッドを使ってサイズ取得する。
    sqlite3_bind_int(statement, 2, [imagedata length]);
    // NSDataのインスタンスメソッドを使ってバイト配列、サイズをパラメータに設定してsqlite3_bind_blobでクエリにバインドする
    sqlite3_bind_blob(statement, 3, [imagedata bytes], [imagedata length], NULL);
    // 実行処理
    sqlite3_step(statement);
    // 終了処理
    sqlite3_finalize(statement);
}
// メモリ解放
[imagedata release];

DBより画像データを読む

NSDataのクラスメソッドinitWithBytesでDBよりバイナリデータを取得します。
UIImageのクラスメソッドimageWithDataに取得したバイナリデータを指定してUIImageのインスタンスを作成します。

// 画像データはsampleimage(UIImage型)に格納するとします。
UIImage *sampleimage;
// SQL
char *sqlImageSelect = "select size,data from IMAGETABLE where id=1";
// クエリの実行方法等は別のエントリー"iPhoneSDKでSQLiteを使う方法(http://d.hatena.ne.jp/uosoft/20090619/1245341478)"参照
if(sqlite3_prepare_v2(database, sqlImageSelect, -1, &statement, NULL) == SQLITE_OK) {
    if (sqlite3_step(statement) == SQLITE_ROW) {
        // NSDataのインスタンスメソッドinitWithBytesでDBよりバイナリデータを取得
        NSData *imagedata = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 2) length:sqlite3_column_bytes(statement, 1)];
        // UIImageインスタンスに取得したバイナリを指定して初期化
        // これでsampleimageにDBに保存した画像データが格納される
        sampleimage = [[UIImage alloc] imageWithData:imagedata];
    }
}


iPhone デベロッパーズ クックブック

iPhone デベロッパーズ クックブック