13,002
回編集
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> | ||