エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

QRコードを生成したときのめも

QRencode で QR コードを生成し、Magick++(ImageMagickC++ 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 で大丈夫でした。