今回はiOS8以上でswiftを使って画像をデータベースへ保存する方法とそれを取得する方法についてメモしておこうと思います。
ここでは画像データをどのように変換しデータベースに保存するか、また取得した際に画像に再変換するにはどのようにするかを取り扱いますがPOSTやJSON受け取りなどの細かな処理については扱いませんのでご了承ください。
必要なライブラリなどは特にありません。
環境
- xcode 6.3
- swift 1.2
- MySQL 5.5 (charset: UTF-8)
はじめに
まずデータベースを編集します。
MySQLの場合はPHPMyAdminなどから自身の定義したテーブルに画像保存用のカラムを追加します。
種別は画像の最大サイズとなり以下の種類がありますので各自の想定に合わせて設定してください。
今回はMEDIUMBLOBを選択しました。
種別 | 最大サイズ |
---|---|
TINYBLOB | 256byte |
BLOB | 64KB |
MIDIUMBLOB | 16MB |
LONGBLOB | 4GB |
準備は以上です。
画像をデータベースへ保存する
データベースへ送る際にはUIImageなどのままでは送信できないため一度BASE64でNSDataに変換したものをStringにし、それを送信します。
//UIImageをデータベースに格納できるStringに変換する
func Image2String(image:UIImage) -> String? {
//画像をNSDataに変換
let data:NSData = UIImagePNGRepresentation(image)
//NSDataへの変換が成功していたら
if let pngData = data {
//BASE64のStringに変換する
let encodeString:String =
pngData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
return encodeString
}
return nil
}
NSDataへの変換は上記ではPNGとなっていますが UIImageJPEGRepresentation を使用すればJPEGも変換可能になります。
JPEGの方を使用する際には第二引数に圧縮率を入れる必要があります。
後はこの関数の戻り値がnilでなければそのままPOSTしてデータベースに格納してあげるだけで保存は完了。
データベースから取得した文字列を再びUIImageに戻す
ここではデータベースから取得した文字列を引数にし、UIImageに変換して返す関数が必要となります。
//StringをUIImageに変換する
func String2Image(imageString:String) -> UIImage?{
//空白を+に変換する
var base64String = imageString.stringByReplacingOccurrencesOfString(" ", withString:"+",options: nil, range:nil)
//BASE64の文字列をデコードしてNSDataを生成
let decodeBase64:NSData? =
NSData(base64EncodedString:base64String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
//NSDataの生成が成功していたら
if let decodeSuccess = decodeBase64 {
//NSDataからUIImageを生成
let img = UIImage(data: decodeSuccess)
//結果を返却
return img
}
return nil
}
上記の関数で一番ポイントとなる点は空白を+に変換している行です。
BASE64では半角英数に加え ' / ' , ' + ' , ' = 'の記号が使用されます。しかしswift上で文字列に変換しデータベースに保存する過程で' + 'は空白にエスケープされて保存されます。そのためデータベースから取得する文字列も同様に' + 'の部分が全て空白になっているため、これらを一括して元に戻すためにstringByReplacingOccurrencesOfString関数を利用して変換しています。
それ以降の行については送る時の逆の処理を行い、最後にNSDataをUIImageに変換する処理をしています。
使用するときはこの関数で返却された値が nil でなければ UIImageView.image に設定する、などとすれば無事画像として表示されます。