0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QRコードの印刷サイズは「距離の1/10」だけでは決まらない

0
Posted at

背景

QRコードを名刺やチラシに載せるとき、「何ミリで刷ればいいのか」で毎回迷います。

調べると「読み取り距離の10分の1」という答えがすぐ出てきます。
50cm離れて読むなら50mm、2mのポスターなら200mm。
分かりやすいので、私もずっとこれで済ませていました。

ただ、これだと読めないケースがあるんですよね…。
今日その計算をするツールを作ったので、何が抜けているのかを整理します。

距離の式に入っていないもの

「距離の10分の1」という式には、コードの中身が一切入っていません。
読み手の位置だけで決まっています。

実際にはこうなります。
同じ25mm四方に印刷したとして、

  • バージョン2(一辺25モジュール)なら、1モジュールは約0.85mm
  • バージョン10(一辺57モジュール)なら、1モジュールは約0.38mm

カメラが白か黒かを判別するのはこの1モジュールに対してなので、後者は読めなくなります。
印刷サイズは同じなのに、です。

ここで言う「モジュール」はQRコードの白黒のマス目1つのことで、「セル」とも呼ばれます。
「バージョン」はコードの大きさを表す1〜40の番号で、データ量が増えると自動的に上がります。

逆算する式

必要なミリ数は、モジュール数から出せます。

const modules = 17 + 4 * version;   // 本体の一辺のモジュール数
const total   = modules + 4 * 2;    // クワイエットゾーン(片側4モジュール)を足す
const sizeMm  = total * moduleMm;   // 1モジュールの大きさを掛ける

version はQRコードのバージョン(1〜40)、moduleMm は1モジュールを何ミリで刷るか。
戻り値の sizeMm が、余白まで含めて確保すべき一辺のミリ数です。

+ 4 * 2 の部分がクワイエットゾーンで、これはQRコードの規格(ISO/IEC 18004・JIS X 0510)で
コードの周囲に4モジュール分の余白が必要と決まっているものです。
読み取り機がコードの範囲を判定するのに使うので、削ると読み取り率が落ちます。

具体例を出します。
バージョン7のコードなら、一辺は 17 + 4 × 7 = 45 モジュール。
余白込みで 53 モジュール。
1モジュールを0.4mmとすると 53 × 0.4 = 21.2mm 必要、ということになります。

0.4mm という数字について

1モジュールの下限としてよく使われるのが0.4mmです。
これは規格で決まっている値ではなく、印刷実務での経験値らしい。
プリンタで再現できて、スマホのカメラで安定して読める、という条件の交点あたりにこの数字がある、という理解でいます。

なので絶対の閾値ではありません。
読み取り機の性能、紙質、照明で前後します。
計算結果が0.4mmを少し上回っていても、それだけで安心はできない…。
最終的には、実際に使うプリンタと読み取り機で試し刷りするしかないと思っています。

逆に、大きく下回っている場合は、試すまでもなく設計から見直す段階だと判断できます。
そこは計算で決められる。

大きくできないときの順番

印刷面積が決まっている場合、打ち手は3つあって、順番があります。

  1. 入れるデータを減らしてバージョンを下げる。URLならトラッキングパラメータを外す、パスを短くする。バージョンが1つ下がれば一辺のモジュールが4つ減るので、同じ印刷サイズでモジュールが大きくなる。
  2. 誤り訂正レベルを下げる。HからMにすると同じデータでもバージョンが下がることがある。ただし汚れへの耐性と引き換えなので、屋外掲示や配送ラベルでは使えない。
  3. クワイエットゾーンを削る。これはやってはいけない。スペースが足りないと真っ先に犠牲になる部分ですが、削るのは印刷サイズを小さくするのと同じことです。

1と2を尽くしてから印刷サイズの話をすると、必要なミリ数そのものが小さくなります。

作ったもの

文字列を入れると、バージョンを実測して必要なミリ数・1モジュールの大きさ・指定dpiでのピクセル数まで出すツールにしました。
https://hashitosystem.com/tools/qrprintsize/

44文字のURLをレベルMで入れると、バージョン4・33モジュール・余白込み41モジュール。
25mmで刷ると1モジュールが0.61mmになる、という具合に出ます。

作ってみて思ったのは、「距離の10分の1」が広まっているのは、たぶん昔のQRコードが今より小さかったからじゃないか、ということです。
URLが短ければバージョンは低いままなので、距離の条件だけ見ておけば足りた。
今は長いURLを入れるので、モジュール側が先に効く。
経験則が悪いのではなく、前提のほうが変わったんだと思います。


本記事はAI補助で執筆した、個人開発の紹介記事です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?