QRencode で QR コードを生成し、Magick++(ImageMagick の C++ API)で画像ファイルに保存してみた、ときのめも。
この二つのライブラリは、Mac の場合、 Homebrew でインストールできます。
#include <iostream> #include <sstream> #include <algorithm> #include <Magick++.h> #include <qrencode.h> int main(int argc, char* argv[]) { QRcode* qr = QRcode_encodeString(argv[1], 0, QR_ECLEVEL_H, QR_MODE_8, 1); int width = qr->width; std::ostringstream pbm_blob_sink; pbm_blob_sink << "P1\n" << width << " " << width << "\n"; std::for_each(qr->data, qr->data + (width * width), [&](unsigned char data) { pbm_blob_sink << (data & 1) << " "; }); std::string pbm_blob = pbm_blob_sink.str(); Magick::Image image(Magick::Blob(pbm_blob.c_str(), pbm_blob.size())); image.write(argv[2]); return 0; }
qrencode-sample.cpp
という名前でファイルに保存してビルド。
$ g++ --std=c++11 `Magick++-config --cppflags --cxxflags --ldflags --libs` -lqrencode -o qrencode-sample qrencode-sample.cpp
このブログのタイトルを QR コードに変換してみます。
$ ./qrencode-sample "エンジニアのソフトウェア的愛情 または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか http://d.hatena.ne.jp/E_Mattsan/" blog.png
結果。QR コードの 1 ドットを PNG の 1 ピクセルで表現しているので(それを拡大表示しているので)見た目がよくないですが、手持ちの iPhone の app で読み取ることができました。
エンコーディングが Shift-JIS の場合は、QR_MODE_KANJI
を指定する必要があるようです。UTF-8 の場合、QR_MODE_8
で大丈夫でした。