協定世界時 (UTC) の2023年7月12日にQRコードのエンコードとデコードを行うためのコマンドラインユーティリティのqrtoolのバージョン0.7.0を公開しました。
この記事では、qrtoolの紹介と、バージョン0.7.0の主な変更点について書こうと思います。
qrtoolとは
qrtoolはQRコードのエンコードとデコードを行うためのコマンドラインユーティリティで、エンコードを行うサブコマンドのencodeと、デコードを行うサブコマンドのdecodeで構成されています。
encodeについてはqrencodeの影響を受けており、decodeについてはzbarimgの影響を受けています。
機能
- 誤り訂正レベルの設定 (
-l) - シンボルのバージョンの設定 (
-v) - マージンの設定 (
-m) - モードの設定 (
--mode) - マイクロQRコードの出力に対応 (
--variant) - 前景色と背景色の設定 (
--foreground、--background)
対応する出力形式
encodeサブコマンドは以下の3種類の出力形式に対応しています。
- PNG (32ビットRGBA、既定値)
- SVG
- ターミナルへの出力 (UTF-8文字列)
PNGとSVG以外の画像形式については、ImageMagickなどによって容易に変換することができるので、これらを利用することを想定しています。
対応する入力形式
decodeサブコマンドが対応する入力形式はimageクレートがデコードできる画像形式で、以下の画像形式です。
- BMP
- DDS
- Farbfeld
- GIF
- RGBE
- ICO
- JPEG
- OpenEXR
- PNG
- PNM
- QOI
- TGA
- TIFF
- WebP
また、SVG画像を入力することにも対応しています。
SVG画像の入力についてはresvgクレートに依存しており、ビルド時に--no-default-featuresオプションを指定することで無効にすることができます。
インストール方法
crates.ioからインストールする場合は、以下のコマンドを実行します。
| |
また、GitHubのリリースページでLinux、macOS及びWindows向けの実行ファイルとドキュメントを含んだアーカイブファイル1を公開しているので、これをダウンロードして利用することもできます。
使い方
基本的なエンコード方法
UTF-8文字列をQRコードにエンコードしてPNG画像として出力するには以下のコマンドを実行します。
| |
エンコードした結果は以下のようになります。
エンコードするデータの入力は、以下のいずれかの方法によって行います。
- 位置引数に文字列を指定する (UTF-8文字列の場合のみ利用可能)
-rオプションでファイルを指定する- 位置引数を省略して、標準入力からデータを読み取る (UTF-8文字列以外も入力可能)
基本的なデコード方法
基本的なエンコード方法で出力したPNG画像をデコードするには以下のコマンドを実行します。
| |
デコードした結果は以下のようになります。
| |
位置引数に画像ファイルを指定しなかった場合と、-を指定した場合は、データは標準入力から読み取られます。
入力された画像の形式は拡張子やマジックナンバーを基に決定されます。
これが失敗する場合は、-tオプションで明示的に画像形式を指定して下さい。
エンコードした結果をSVG画像として出力する
encodeサブコマンドはデフォルトではPNG画像を出力しますが、エンコードした結果をSVG画像として出力する場合は以下のコマンドを実行します。
| |
この例では-tオプションで出力形式としてSVGを指定しています。
また、-oオプションではエンコードした結果を出力するファイルを指定しています。
デフォルトでは、エンコードした結果は標準出力に出力されます。
マイクロQRコードを出力する
マイクロQRコードを出力するには以下のコマンドを実行します。
| |
エンコードした結果は以下のようになります。
なお、マイクロQRコードを出力する場合は-vオプションでシンボルのバージョンを指定する必要があります。
前景色や背景色を変更したQRコードを出力する
前景色にCSSの<named-color>のbrownを指定して出力するには以下のコマンドを実行します。
| |
エンコードした結果は以下のようになります。
--foregroundと--backgroundにはCSS Color Module Level 42で定義されている色の値を指定することができます。
--foregroundの既定値は<named-color>のblack (#000000) で、--backgroundの既定値は<named-color>のwhite (#ffffff) です。
シェル補完スクリプトの生成
--generate-completionオプションを指定することでシェル補完スクリプトを生成することができます。
| |
以下のシェルの補完スクリプトを生成することができます3。
- Bash
- Elvish
- Fish
- PowerShell
- Zsh
別のコマンドとの連携
encodeサブコマンドとdecodeサブコマンドはどちらも標準入力からの読み取りと標準出力への書き込みに対応しているので、フィルタープログラムとして利用することもできます。
以下の例では、Cargo.tomlの内容を標準入力から読み取って、QRコードにエンコードした結果をPNG画像として標準出力に出力して、ImageMagickのmagickコマンドでPNG画像からJPEG XL画像に変換しています。
| |
以下の例では、magickコマンドでJPEG XL画像からPNG画像に変換したQRコードを標準入力から読み取って、これをデコードした結果を標準出力に出力し、batコマンドでTOMLとしてシンタックスハイライトして表示しています。
| |
バージョン0.7.0の主な変更点
QOI画像形式を明示的に指定できるようになった
imageクレートのバージョン0.24.6からQOI画像形式に対応していたので、qrtoolのバージョン0.6.0の時点で-tオプションを指定しない場合にはQOI画像を入力することに対応していました。
しかし、READMEの対応する画像形式についての表には載っていなかったことから対応していることに気が付かず4、-tオプションでQOI画像形式を指定することができない状態でした。
なので、この問題に対応するために-tオプションの値にqoiを追加しました。
前景色と背景色を指定する際に指定できる値の種類を増やした
従来は独自に値をパースしており、16進数表記 (#ff0000など) にだけ対応していました。
独自にパースするのを止めたいと考え、csscolorparserクレートを利用するように変更しました。
この結果として、rgb()関数表記やhsl()関数表記などでも前景色と背景色を指定できるようになりました。
manページなどのドキュメントのライセンスをCC BY 4.0に変更した
従来はドキュメントも含めてプロジェクト全体にApache License 2.0とMIT Licenseのデュアルライセンスとしていましたが、これらのライセンスはドキュメントには適していないことや、プロジェクトの人間の貢献者が自分だけでライセンスの変更が容易なので、manページなどのドキュメントのライセンスをこれらにより適したCC BY 4.0に変更しました。
ラスター画像の形式の決定に拡張子も利用するように変更した
従来はラスター画像の形式はマジックナンバーだけを基に決定していましたが、拡張子も利用するように変更しました。 これによって、TGA形式の画像を入力する場合に明示的に画像形式を指定することが必須ではなくなりました。
終わりに
qrtoolとバージョン0.7.0の主な変更点の紹介をしました。
詳細な利用方法はqrtool Documentationのmanページでも確認することができます。
気に入ってもらえたらsorairolake/qrtoolでStarを付けてもらえるとありがたいです。
qrtoolの改善のためにIssueやPull Requestもお待ちしています。
アーカイブの種類は
.tar.zst(Linux、macOS) と.7z(Windows) です。 ↩︎MDN Web Docsを参照。 ↩︎
clap_completeクレートに基づきます。 ↩︎


