🛠️

QRコードを読み書きするコマンドを開発している話

2024/03/05に公開

QRコードを読み書きするコマンドのqrtoolを開発しているので紹介します。

qrtoolのスクリーンショット

qrtoolとは

qrtoolはRustで書かれたQRコードを読み書きするためのコマンドラインユーティリティです。

https://github.com/sorairolake/qrtool

このプログラムはqrencodezbarimgから着想を得ています。

インストール方法

Packaging status

ソースコードから

Cargoを利用してインストールすることができます。

cargo install qrtool

ビルド済みバイナリから

リリースページでLinux、macOS、Windows向けのビルド済みバイナリを公開しているので、これをインストールすることもできます。

使い方

基本的な使い方

「QR code」という文字列をQRコードにエンコードするには以下のようにします:

qrtool encode "QR code" > output.png

出力
出力される画像

この画像をデコードするには以下のようにします:

qrtool decode output.png

出力される文字列:

QR code

エンコードの際に-tオプションを使用すると出力形式を変更できます。
デフォルトはpngですが、svgterminal(ターミナルに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 encodeqrtool 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

終わりに

より詳しいことについてはホームページで見ることができます。

https://sorairolake.github.io/qrtool/book/index.html

GitHubで編集を提案

Discussion