「Qtの応用 - QRコード」の版間の差分

ナビゲーションに移動 検索に移動
197行目: 197行目:
==== QRコードの生成 ====
==== QRコードの生成 ====
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <ZXing/MultiFormatWriter.h>
#include <ZXing/BitMatrix.h>
#include <ZXing/BarcodeFormat.h>
#include <ZXing/ReadResult.h>
  // ZXingライブラリのフォワード宣言
  // ZXingライブラリのフォワード宣言
  namespace ZXing {
  namespace ZXing {
206行目: 211行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
 
まず、QRコード生成のオプションを設定する。<br>
<br>
対応するバーコードフォーマット<br>
* ZXing::BarcodeFormat::QR_CODE      // QRコード
* ZXing::BarcodeFormat::DATA_MATRIX  // データマトリックス
* ZXing::BarcodeFormat::AZTEC        // Aztecコード
* ZXing::BarcodeFormat::PDF_417      // PDF417
* ZXing::BarcodeFormat::CODE_128      // CODE 128
* ZXing::BarcodeFormat::CODE_39      // CODE 39
* ZXing::BarcodeFormat::EAN_13        // EAN-13
* ZXing::BarcodeFormat::EAN_8        // EAN-8
* ZXing::BarcodeFormat::UPC_A        // UPC-A
* ZXing::BarcodeFormat::UPC_E        // UPC-E
<br>
エラー訂正レベル<br>
* ZXing::ErrorCorrectionLevel::Low      // 約7%のエラー訂正
* ZXing::ErrorCorrectionLevel::Medium  // 約15%のエラー訂正
* ZXing::ErrorCorrectionLevel::Quality  // 約25%のエラー訂正
* ZXing::ErrorCorrectionLevel::High    // 約30%のエラー訂正
<br>
その他の主要なオプション<br>
* options.characterSet    // 文字エンコーディング ("UTF-8", "Shift_JIS"等)
* options.quietZone        // 余白サイズ (-1で自動)
* options.autoColor        // 自動色設定 (true / false)
* options.foregroundColor  // 前景色 (QRコードの色)
* options.backgroundColor  // 背景色
<br>
QRコード特有のオプション<br>
* options.qrVersion      // QRコードのバージョン (1〜40)
* options.qrMaskPattern  // マスクパターン (0〜7)
* options.minVersion    // 最小バージョン
* options.maxVersion    // 最大バージョン
<br>
<syntaxhighlight lang="c++">
ZXing::MultiFormatWriter::Option options;
// バーコードのフォーマットを指定
// QR_CODE以外にも複数のフォーマットが指定可能 (後述)
options.format = ZXing::BarcodeFormat::QR_CODE;
// QRコードの余白 (Quiet Zone) のサイズを指定
// 単位はモジュール (QRコードの最小単位となる点)
// 一般的な値は1〜4, 小さすぎると読み取りが困難になる
options.margin = 2;
// QRコードの出力サイズを指定 (ピクセル単位)
// width : 横幅,  height : 高さ
// 大きすぎると処理時間が増加, 小さすぎると読み取りが困難
// 一般的な最小サイズは、21x21ピクセル
// 推奨サイズは、200x200〜1000x1000ピクセル
options.width  = width;
options.height = height;
// エンコードオプション (追加可能なオプション)
// options.eccLevel    = ZXing::ErrorCorrectionLevel::Medium;  // エラー訂正レベル
                                                                // 高いレベルほどQRコードの損傷に強い
                                                                // ただし、データ容量は減少
                                                                // 一般用途ではMediumが推奨
// options.characterSet = "UTF-8";                              // 文字エンコーディング
                                                                // 日本語を含む場合はUTF-8またはShift_JISを指定
                                                                // 英数字のみの場合は指定不要
// options.quietZone    = -1;                                  // 余白サイズ (-1で自動)
                                                                // 最低でも4モジュール分必要
                                                                // 読み取り環境が悪い場合は多めに設定
</syntaxhighlight>
<br>
次に、任意の文字列データをQRコードにエンコードする。<br>
<syntaxhighlight lang="c++">
// 戻り値のmatrixはビット行列 (BitMatrix) 形式
// 各ビットが黒 (true) か 白 (false) を表す
auto matrix = writer->encode(text.toStdString(), options);
// QRコードを描画するためのQImage作成
// Format_RGB32 : 32ビットRGBフォーマット (8bitずつR, G, B, 予約)
QImage image(width, height, QImage::Format_RGB32);
// 背景を白で塗りつぶし
image.fill(Qt::white);
// BitMatrixをQImageに変換
for (int y = 0; y < matrix.height(); y++) {
    for (int x = 0; x < matrix.width(); x++) {
      // matrix.get(x, y)がtrueの場合、その点は黒
      if (matrix.get(x, y)) {
          // 黒色のピクセルを設定(R=0, G=0, B=0)
          image.setPixel(x, y, qRgb(0, 0, 0));
      }
      // falseの場合は白のまま
    }
}
</syntaxhighlight>
<br>
最後に、QRコード画像をファイルに保存する。<br>
対応している画像形式は、PNG、JPEG、BMP等がある。<br>
<syntaxhighlight lang="c++">
// 戻り値 : 保存成功でtrue, 失敗でfalse
image.save(filePath);
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー