[C#]base64で画像のdecodeとencode

C#

業務でbase64の文字列から、画像変換するといったことをやったので
復習をかねて、base64でencodeした画像をC#のAzureFunctionsを使って、decodeしてみました。

base64とは?

なんだったか…と思って調べてみました。
こちらのQiitaの記事で実装されていて、わかりやすいです。

すべてのデータを64文字に当てはめてコード化する方式みたいですね。
aだったら011010、bだったら011011みたいなビット列にするみたいな感じです。

なるほど…🤔

base64画像をエンコード

コード

[FunctionName("ImageToBase64")]
public static IActionResult ImageToBase64(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "image_to_base64")] HttpRequest req,
    ILogger log)
{
    var stream = new StreamReader(req.Body).BaseStream;
    byte[] bytes;
    using (BinaryReader br = new BinaryReader(stream))
    {
        bytes = br.ReadBytes((int)stream.Length);
    }
    var base64Image = Convert.ToBase64String(bytes);
    return new OkObjectResult(base64Image);
}

解説

こんな感じのfunctionを作って、エンコードしてみました。
POSTされたデータをstreamに変換して、BinaryReaderで読み込んで、byteの配列にしています。

ポイントはConvert.ToBase64Stringにbyte配列を渡すところで、これでbase64の文字列が返ってきます。

base64画像をデコード

コード

[FunctionName("Base64ToImage")]
public static async System.Threading.Tasks.Task<IActionResult> Base64ToImageAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "base64_to_image")] HttpRequest req,
    ILogger log)
{
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    var base64Image = data?.image;

    var bytes = Convert.FromBase64String(base64Image.Value);

    return new FileContentResult(bytes, "image/png");
}

解説

デコードはこんな感じになりました。
JSON形式でPOSTされたbase64の文字列からbyte配列に変換して、FileContentResultで返しています。

ポイントはConvert.FromBase64Stringにbase64文字列を渡すところで、これでbyte配列が返ってきます。

動作確認

/api/image_to_base64 に画像を添付して、postします。

画像からbase64の文字列が返ってきました!

返ってきた文字列をjsonのimage項目に付けて、postします。

base64の文字列から画像が返ってきました!

文字列だけでデータのやり取りができるので、JSONの一つの項目として扱えて便利ですね。

github

コメント

タイトルとURLをコピーしました