Qtの応用 - QRコード
概要
ZXing-C++ライブラリ
ZXing-C++ライブラリとは
ZXing-C++は、C++で実装されたオープンソースのマルチフォーマットリニア / マトリックスバーコード画像処理ライブラリである。
元々、JavaのZXingライブラリから移植されが、さらに開発されて、現在ではランタイムと検出性能の面で多くの改善が含まれている。
多くのフォーマットのバーコードの読み取りおよび書き込みが可能である。
対応しているフォーマットを以下に示す。
1D product | 1D industrial | 2D |
---|---|---|
UPC-A | Code 39 | QRコード |
UPC-E | Code 93 | Data Matrix |
EAN-8 | Code 128 | Aztec |
EAN-13 | Codebar | PDF 417 |
UPC/EAN Extension 2/5 | ITF | MaxiCode |
RSS-14 | ||
RSS-Expanded |
なお、ZXing-C++ライブラリのライセンスは、Apache-2.0となっている。
ZXing-C++ライブラリのインストール
パッケージ管理システムからインストール
# RHEL sudo dnf install zxing-cpp-devel # SUSE sudo zypper install zxing-cpp-devel
ソースコードからインストール
ZXing-C++ライブラリのビルドに必要なライブラリをインストールする。
# RHEL sudo dnf install make cmake gcc gcc-c++ stb-devel \ opencv-devel # ZXing向けOpenCVのサンプルコードもインストールする場合 qt6-qtbase-devel qt6-qtmultimedia-devel # Qt向けのサンプルコードもインストールする場合 # SUSE sudo zypper install make cmake gcc gcc-c++ stb-devel \ opencv-devel # ZXing向けOpenCVのサンプルコードもインストールする場合 qt6-gui-devel qt6-quick-devel qt6-multimedia-devel # Qt向けのサンプルコードもインストールする場合
br>
ZXing-C++のGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf zxing-cpp-<バージョン>.tar.gz cd zxing-cpp-<バージョン>
または、git clone
コマンドを使用してソースコードをダウンロードする。
git clone https://github.com/zxing-cpp/zxing-cpp.git
ZXing-C++ライブラリをビルドおよびインストールする。
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=<ZXing-C++のインストールディレクトリ> \ .. make -j $(nproc) make install
CMakeLists.txtファイルの設定
find_package(ZXing REQUIRED)
target_link_libraries(<プロジェクト名> PRIVATE
ZXing::ZXing
)
QRコードの読み込み
まず、QImageクラスを使用して画像ファイルを読み込む。
QImageクラスでは、PNG、JPEG、BMP、GIF等の一般的な画像形式に対応している。
#include <ZXing/MultiFormatReader.h>
#include <ZXing/BitMatrix.h>
#include <ZXing/BarcodeFormat.h>
#include <ZXing/ReadResult.h>
// ZXingライブラリのフォワード宣言
namespace ZXing {
class MultiFormatReader;
}
// ZXingライブラリのインスタンス
std::unique_ptr<ZXing::MultiFormatReader> reader;
QImage image(filePath);
// 画像の読み込みに失敗した場合
// ファイルが存在しない場合や破損している場合等
if (image.isNull()) {
qDebug() << "画像の読み込みに失敗 : " << filePath;
return QString();
}
次に、読み込んだ画像の幅と高さを取得する。
これらの値は、ピクセル単位で表される。
int width = image.width();
int height = image.height();
ZXingライブラリで処理するためのピクセルバッファを作成する。
そして、画像の各ピクセルをグレースケールに変換する。
// uint8_tは8ビット(0-255)のグレースケール値を格納するために使用
// 配列サイズは width * height (総ピクセル数)
std::vector<uint8_t> pixels(width * height);
// 画像の各ピクセルをグレースケールに変換
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// QRgbはQtのRGB値を表す型(32ビット整数)
QRgb pixel = image.pixel(x, y);
// qGray関数でRGB値をグレースケール(0-255)に変換
// 変換式: Gray = (R * 11 + G * 16 + B * 5) / 32
// 1次元配列のインデックスに変換: y * width + x
pixels[y * width + x] = qGray(pixel);
}
}
ZXingのImageViewオブジェクトを生成する。
ZXing::ImageViewの第4引数 (ImageFormat) で指定可能な値
- ZXing::ImageFormat::Lum
- 輝度 (Luminance) のみの画像フォーマット
- 8ビットグレースケールであり、最も一般的で処理が高速である。
- そのため、QRコード読み取りに最適である。
- ZXing::ImageFormat::RGB
- RGBカラー形式で、各ピクセルは24ビット (R:8bit、G:8bit、B:8bit)
- ただし、メモリ使用量が多い。
- ZXing::ImageFormat::BGR
- BGRカラー形式
- RGBと同様だが、バイト順が逆となる。
- Windowsのビットマップ等で使用されている。
- ZXing::ImageFormat::RGBX
- RGBにアルファチャンネルを加えた32ビット形式
- アルファ値は無視される。
- ZXing::ImageFormat::BGRX
- BGRにアルファチャンネルを加えた32ビット形式
- アルファ値は無視される。
- ZXing::ImageFormat::XRGB
- パディングバイトの後にRGBが続く形式
- ZXing::ImageFormat::XBGR
- パディングバイトの後にBGRが続く形式
画像フォーマットの指定において、QRコード読み取りの場合は、Lumが最適 (処理が高速で十分な情報量) である。
メモリ使用量を考慮する場合は、Lumが推奨される。
カラー情報が必要な場合は、RGBまたはBGRを使用する。
元画像のフォーマットに合わせて選択することにより、変換のオーバーヘッドを削減できる。
// 第1引数 : ピクセルデータへのポインタ
// 第2引数 : 画像の幅 (ピクセル)
// 第3引数 : 画像の高さ (ピクセル)
// 第4引数 : 画像フォーマット (下記参照)
ZXing::ImageView imageView(pixels.data(), width, height, ZXing::ImageFormat::Lum);
最後に、QRコードの読み取りを行う。
// ZXing::MultiFormatReader::readメソッドは、ZXing::ReadResult型を返す
auto result = reader->read(imageView);
// 読み取り結果が有効な場合、テキストを返す
// 無効な場合は空のQStringを返す
if (result.isValid()) {
return QString::fromStdString(result.text());
}
QRコードの生成
// ZXingライブラリのフォワード宣言
namespace ZXing {
class MultiFormatWriter;
}
// ZXingライブラリのインスタンス
std::unique_ptr<ZXing::MultiFormatWriter> writer;