openFrameworksでBase64というstringに変換する方法
Base64てのは画像ファイルとか音声ファイルとかいろんなデータを64種類の文字列に変換する方式のことで、これすることでデータサイズはちょい増えるけどたいていのファイルを簡単にテキスト化して受け渡しできるというもの。みたい。
https://ja.m.wikipedia.org/wiki/Base64
ターミナルとかなら簡単で、ofSystemなどでコマンド実行して〜みたいなやり方もあると思いますが、oF上でスマートに変換したかったので、いろいろ調べてまとめました。
base64のエンコードとかデコードはC++のネットワーク系ライブラリPocoの中にも実装されていて、今回のやり方ではそれを利用しています。
※of0.10.0からはPocoがアドオン化されているので、ProjectGeneratorなどからofxPocoを追加する必要があります。
ofImageにおける変換については探してみたらもろ答えがあった。ありがたみ🙏
https://gist.github.com/kidapu/0b9c2cbe98191a394c80
あと、変換したstringに改行コードが含まれている場合があって、それが邪魔してデコード失敗するときなどがありました。
というわけで、変換後のstringから改行コードを削除する関数(removeCRLF)も用意しています。
参考にしたのはこちら、そのままだけど。
https://teratail.com/questions/34367
他にも音声ファイルを変換したかったので、やりました。
※音声ファイルはofSoundBufferをwavとしてofBufferに直しています。こちらは後日ついきします。
とりあえず画像や音声データ→Base64に変換(エンコード)がしたかったのでそれのみ。
確認の時に使ったブラウザ上で画像↔Base64の変換確認できるサイト
https://lab.syncer.jp/Tool/Base64-encode/
最近よくoFからAPIを叩くのですが、その時にファイルを送るときは大抵Base64に変換したものを送るので、こうやってまとめておくと便利かも☺︎
使い方としては、ofApp.hなどで #include “ofBase64.h” ってしといて
string imageData = ofBase64::base64_encode(fbo);
という感じで。
classを作る代わりにnamespaceを作って、static関数を定義すれば、グローバルな関数(厳密には違う?)を作れるんですね。地味に結構便利そう。