今回はQRコードのエンコード用のライブラリを使わせていただいたのですが、バイナリあるのに「わざわざ」configureスクリプトを生成するところからです。最近 configure するような作業をしてないので、更新後のPCにはツールも入ってなかったです。たまにやらないと忘却力がすべてを押し流していってしまいます。
※「ソフトな忘却力」投稿順 Index はこちら
libqrencode
「QRコード」を表示さえできれば、解読できるスマホは皆さん持ち歩いているので何かと便利じゃないかと思います。組み込み用途でも小さなLCDパネルにQR表示できるとグダグダ数字でエラーコードなど表示できるより遥かに利便性が高いように思います(個人の感想です。)
さてQRコードをエンコードする多分定番のライブラリが、福地健太郎先生(明治大学教授)の作られた以下でないかと思います。
高速かつコンパクトなライブラリです。今回は、これをWindows11のWSL2にインストールしたUbuntu 20.04 LTS上で、実習してみることにいたしました。
Ubuntu上、apt infoで調べてみると、以下のようでした。
ということは、apt install でインストール可能なパッケージが存在するということです。やっぱりバイナリでインストールする方がお楽。最近しばらくソースからビルドするようなインストレーションしてません。
しかしね、別シリーズで configure がらみの件あり、しばらく configure などしていないことに気づきました。昨年の晩秋にパソコンを更新しているので、現パソコン上には autotool などもインストールしていないハズ。
今回は福地健太郎先生のWebサイトを参考に、ソースからビルドしてインストールしてみるか、と思い立った次第です。
まずは git cloneから
福地健太郎先生のサイトには zip 形式のソースパッケージがおかれており、そちらの方をダウンロードすると「もれなくconfigureスクリプト」がついてくるみたいです。しかし、autotool とか必要なツールを「ついでにインストール」するという目的があるので、GitHubからクローンします。こちらには configureスクリプトは無し。
$ git clone https://github.com/fukuchi/libqrencode
さて、手元のUbuntuを眺めると、以下のパッケージは未インストールでした。
autoconf, automake autotools-dev libtool
そこで上記をインストール(こいつらはaptでバイナリからだけれども。)なお、以下のパッケージも必要ですが、こいつらは既にインストール済だったです。
pkg-config libpng-dev
configureスクリプトの生成
configure.ac とautogen.sh がダウンロードファイルに含まれているので、autogen.shを使って configureスクリプトを生成します。
生成後、configure。おお、chekingという表示がダラダラと。久しぶりに見たな。configureしてますね。
上記にてMakefileなど出来たので、libqrencode本体のビルドとインストールに入ります。
$ make $ sudo make install $ sudo ldconfig
ここまでノーエラー、結構素早くインストールまでできました。
この時点で「付属ツール」qrencodeが使えるようになっているので、以下のようにすれば、文字列 xxx を画像ファイル yyy.png にエンコードするなどということはできるようになってます(詳しい使い方は Helpを見てね。)
$ qrencode xxx -o yyy.png
libqrencodeライブラリを使った「ミニマム」プログラム試作
ようやく本題にたどり着きました。libqrencodeライブラリを使った「サンプル」プログラム、余計なものを一切省いたQRコード生成例を自前のC言語コードで作るというものです。
ただ画像出力は微妙。何かライブラリを呼んでカッコイイ画像フォーマットで出力するのは良いけれど、後で「煮たり焼いたりするとき」には困りそう。そこで完全自前のごく短いコードで出力可能なPBMフォーマットに決定しました。PBMフォーマットは、Go言語でいろいろ画像出力するときにも使わせていただております。ともかくシンプルでお楽(ファイルサイズは膨らむけど。)フォーマットの解説は、碧色工房様の以下のページを参照させていただいとります。
さて、作成したサンプルプログラムが以下に。キメウチの文字列 “This is a test.”をQRコードにエンコードし、PBMフォーマットで標準出力に書き出すもの。PBMフォーマットはテキストなので、これをリダイレクトすれば白黒画像ファイルになると。内部で呼び出している構造体や関数、enumなどの説明は、qrencode.h にかかれてます。Web上のDoxygenドキュメントはこちら。
#include <stdio.h> #include <qrencode.h> int main(void) { QRcode *qrc=QRcode_encodeString("This is a test.", 0, QR_ECLEVEL_L, QR_MODE_8, 1); printf("P1\n"); //Output PBM format printf("%d %d\n", qrc->width, qrc->width); for (int y=0; y<qrc->width; y++) { for (int x=0; x<qrc->width; x++) { printf("%d ",qrc->data[y*qrc->width + x] & 0x1); } printf("\n"); } return 0; }
上記プログラムのコンパイルのコマンドラインが以下に
$ gcc -g -O0 -Wall tstQrencode.c -lqrencode
出来上がった a.out を走らせると stdout にPBMファイルがボロリン。
21ドットx21ドットで済むのね。
これをリダイレクトしてファイルに落とし、画像ビューワーでみたものが冒頭のアイキャッチ画像に。
この小さいサイズのQRをスマホのカメラで眺めると、
This is a test.
よめましたな、成功。しかし、待てよ、サンプルコード、QRcode_free()してない(確保したメモリ開放してない)けど、いいのか!ダメじゃん。
ソフトな忘却力(27) MPFR、the Multiple Precision Floating-Point Reliable Library へ戻る