SwiftでUIImageとStringの相互変換

Swiftを使ってデータベースに画像をPOSTしたい場合、UIImageはそのままPOSTすることはできません、そこで今回はUIImageとStringの相互変換の処理について紹介します。(qiitaにもまとめましたが)

まずはUIImageを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

}

UIImagePNGの部分はJPEGに変えることもできます。

次はStringを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

}

一番のポイントは空白を+に変換する処理。
例えばデータベースに保存した画像のStringをクライアントで取得した場合には本来+だった部分が空白に変換されてしまうことがあるため取得した際にはこのような変換が必要となります。

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

C++らしく日付取得をする

C++で日付取得する方法について

C言語では<time.h>を利用して時間の構造体を取得していました、同様にC++は上位置換なので同じ方法で取得することができますがなんか違和感を覚える人向けにC++チックな日付の取得について

C++で日付を利用するときには以下の2つのヘッダを利用すると便利です

#include <iomanip> //時間を取得するため
#include <sstream> //値を簡単に文字列にするため

例えば 2015-5-19 のようなフォーマットの文字列が必要な場合はこのように記述します


    //現在日時を取得する
    time_t t = time(nullptr);

    //形式を変換する    
    const tm* lt = localtime(&t);

    //sに独自フォーマットになるように連結していく
    std::stringstream s;
    s<<"20";
    s<<lt->tm_year-100; //100を引くことで20xxのxxの部分になる
    s<<"-";
    s<<lt->tm_mon+1; //月を0からカウントしているため
    s<<"-";
    s<<lt->tm_mday; //そのまま

    //result = "2015-5-19" 
    std::string result = s.str();

stringstreamを利用することによってデフォルトのフォーマットだけでは対応できない場合も独自のフォーマットを定義できる。

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