title | emoji | type | topics | published | published_at | |||
---|---|---|---|---|---|---|---|---|
QRコードを読み書きするコマンドを開発している話 |
🛠️ |
tech |
|
true |
2024-03-05 12:30 |
QRコードを読み書きするコマンドのqrtool
を開発しているので紹介します。
qrtoolはRustで書かれたQRコードを読み書きするためのコマンドラインユーティリティです。
https://github.com/sorairolake/qrtool
このプログラムは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文字列として出力)として出力することもできます。
qrtoolはデフォルトでは通常のQRコード(normal
)を生成しますが、--variant
オプションにmicro
を指定することでマイクロQRコードを生成することができます。
qrtool encode -v 3 --variant micro "QR code" > output.png
エンコードの際に--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
https://github.com/shssoichiro/oxipng
SVG画像の最適化をしたい場合は以下のようにします:
qrtool encode -t svg "QR code" | svgcleaner -c - > output.svg
https://github.com/RazrFalcon/svgcleaner
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
より詳しいことについてはホームページで見ることができます。