業務で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の一つの項目として扱えて便利ですね。
コメント