QRコードを読み書きするコマンドを開発している話
QRコードを読み書きするコマンドのqrtool
を開発しているので紹介します。
qrtoolとは
qrtoolはRustで書かれたQRコードを読み書きするためのコマンドラインユーティリティです。
このプログラムはqrencode
とzbarimg
から着想を得ています。
インストール方法
ソースコードから
Cargoを利用してインストールすることができます。
cargo install qrtool
ビルド済みバイナリから
リリースページでLinux、macOS、Windows向けのビルド済みバイナリを公開しているので、これをインストールすることもできます。
使い方
基本的な使い方
「QR code」という文字列をQRコードにエンコードするには以下のようにします:
qrtool encode "QR code" > output.png
出力される画像
この画像をデコードするには以下のようにします:
qrtool decode output.png
出力される文字列:
QR code
エンコードの際に-t
オプションを使用すると出力形式を変更できます。
デフォルトはpng
ですが、svg
かterminal
(ターミナルにUTF-8文字列として出力)として出力することもできます。
マイクロQRコードの生成
qrtoolはデフォルトでは通常のQRコード(normal
)を生成しますが、--variant
オプションにmicro
を指定することでマイクロQRコードを生成することができます。
例
qrtool encode -v 3 --variant micro "QR code" > output.png
出力される画像
色付きのQRコードを出力する
エンコードの際に--foreground
オプション(デフォルトは<named-color>
のblack
)を使うと前景色を変更することができ、--background
オプション(デフォルトは<named-color>
のwhite
)を使うと背景色を変更することができます。
値には以下のいずれかのCSS color stringを取ります:
例
qrtool encode --foreground brown --background lightslategray "QR code" > output.png
出力される画像
デコードできる画像ファイルフォーマット
qrtool decode
は以下の画像ファイルフォーマットをサポートしています:
これはimage
クレートがデコードできる全ての画像ファイルフォーマットとresvg
クレートによるものです。
ファイルフォーマットは画像のマジックナンバーから自動的に決定し、それが失敗した場合は拡張子に基づいて決定します。
-t
オプションを使用するとこれらの動作を無視してファイルフォーマットを指定することができます。
例
入力する画像
qrtool decode input.webp
# または
qrtool decode -t webp input.webp
出力:
QR code
補完スクリプトの生成
--generate-completion
オプションを使用することで以下のシェル向けの補完スクリプトを生成できます:
bash
elvish
fish
nushell
powershell
zsh
例
qrtool --generate-completion bash > qrtool.bash
他のプログラムとの連携
qrtool encode
とqrtool decode
はどちらも標準入力からの読み取りと標準出力への書き込みができるので、他のプログラムと容易に連携することができます。
出力される画像の最適化
qrtool encode
の出力するPNG画像はアルファチャンネルが不要な場合やモノクロの場合でも32ビットRGBA形式で出力します。
これはそのような場合に24ビットRGB形式などに切り替えるのはプログラムが複雑になりそうですし、対応しても最適化された画像の出力は難しいと思ったからです。
もし、画像のサイズを減らしたい場合にはリダイレクトと画像最適化ツールを利用することで簡単にそれを実現することができます。
PNG画像の最適化をしたい場合は以下のようにします:
qrtool encode "QR code" | oxipng - > output.png
SVG画像の最適化をしたい場合は以下のようにします:
qrtool encode -t svg "QR code" | svgcleaner -c - > output.svg
対応していない画像ファイルフォーマットの読み取りと書き込み
PNGかSVG以外の画像ファイルフォーマットで保存したい場合や、デコードできないファイルフォーマットの画像をデコードしたい場合には、ImageMagickなどのコマンドとリダイレクトを利用します。
標準入力からCargo.toml
を読み取ってエンコードした結果をJPEG XL画像として保存する:
cat Cargo.toml | qrtool encode | magick png:- output.jxl
保存した画像をデコードしてbat
を使って表示する:
magick output.jxl png:- | qrtool decode | bat -l toml
終わりに
より詳しいことについてはホームページで見ることができます。
Discussion