しいしせねっとわーく Get FirefoxAmazon.co.jp アソシエイト
[技術資料室] [フォーマット辞典][ネットワーク編] [ハード部屋]
[A5502K]

QRコードの情報

QRコードは、JIS X 0510になっています。これを元にして、いろいろしてみたいと思います。QRコードはデンソーが開発した2次元コードです。ほかいもいろいろ2次元コードがあります。オリンパスの開発したSTコードなんていうのも比較的新しいですね。QRの次だからSTなのでしょうか。どちらもauのA5502Kで使えるので、いいかも。STコードも仕様は公開予定とか。

ほかのサイトでは、一般向けの解説がほとんど・・・か?

QRコードの基本形式

これはモデル2の説明です。モデル1は旧式のようなので省略。マイクロQRもA5502Kで使えないので省略。

基本的に、格納できるのは数値ではなく文字です。

座標は、左上を(0,0) として説明しますか。


1型

2型

6型

7型

14型

□ 明のモジュール
暗のモジュール
データ及び誤り訂正コード語
形式情報及びその誤り訂正符号(マスクの種類など)
型情報及びその誤り訂正符号(大きさの情報)

1ドットに相当するものは、セルとかモジュールとかいいます。

大きさは1型から40型まであります。1型が21×21モジュール、4ずつ大きくなります。最大サイズは40型で177×177モジュールです。余白(クワイエットゾーン)が周囲に4モジュール分必要です。

3隅にあるのは、位置検出パターンです。小さい方のは、位置合わせパターンです。黒と白は、このままで、グレー(と赤)の部分に各種データを書きます。

位置検出パターンは、黒白黒黒黒白黒の縦横7x7セルの位置検出要素パータンを3つまとめたときの名称です。そのまわりには余白(位置検出パターンの余白パターン)が1セル分あります。

位置合わせパターンは、大きいパターンの位置をあわせるためのもので、位置検出要素パターンを小さくしたようなものです。黒白黒白黒と、中の黒が1セルになって5x5セルになっています。まわりに白はありません。

位置検出パターンをつないでいる、上と左から各7モジュール目にあるのはタイミングパターンです。

ここまでの基本的なのをあわせて機能パターンといいます。

データはデータ及び誤り訂正コード語の部分に書かれます。

形式情報、型情報、データ及び誤り訂正コード語の部分で、データの部分とあわせて符号化領域といいます。

データ及び誤り訂正コード語の部分は、データを書いた後、パターンをかぶせます。

誤り訂正は、リードソロモン誤り訂正を使った4段階の精度があります。

L 7% M 15% Q 25% H 30%

Lの方が訂正できる精度が落ちますが、多くのデータを入れることができます。

どの程度の誤り訂正をするかは、マスクの種類と共に形式情報のところに書かれています。

作るには

とりあえずモデル1を作ることはないと思うのでモデル2ということで。データを作る手順ではなくてプログラム作る手順で考えてます。JISの表みればいいのだけど。

データと型とを作るのですが、まずは型から作ってみます。まぁ、普通とは逆かも。

配列は、マスク用とビット用の2階層で用意しました。まずまわりを固めて、そこへマスクをみながらデータを流し込もうかと。データ以外の部分はあとから入れる部分も含めてマスクしておきます。

符号化の方法にいくつかあるので、それを決める。データの入る大きさを選ぶ。位置合わせパターンの数がまず決まっていないとデータに使えるサイズがわからないかもしれない。位置合わせパターンの位置から先にみてみようか。

型番 モジュール数/
辺(A)
位置合わせパターン 容量

中央位置

間隔
1 21 -    
2 25 6,18 12  
3 29 6,22 16  
4 33 6,26 20  
5 37 6,30 24  
6 41 6,34 28  
7 45 6,22,38 16,16  
8 49 6,24,42 18,18  
9 53 6,26,46 20,20  
10 57 6,28,50 22,22  
11 61 6,30,54 24,24  
12 65 6,32,58 26,26  
13 69 6,34,62 28,28  
14 73 6,26,46,66 20,20,20  
15 77 6,26,48,70 20,22,22  
16 81 6,26,50,74 20,24,24  
17 85 6,30,54,78 24,24,24  
18 89 6,30,56,82 24,26,26  
19 93 6,30,58,86 24,28,28  
20 97 6,34,62,90 28,28,28  
21 101 6,28,50,72,94 22,22,22,22  
22 105 6,26,50,74,98 20,24,24,24  
23 109 6,30,54,78,102 24,24,24,24  
24 113 6,28,54,80,106 22,26,26,26  
25 117 6,32,58,84,110 26,26,26,26  
26 121 6,30,58,86,114 24,28,28,28  
27 125 6,34,62,90,118 28,28,28,28  
28 129 6,26,50,74,98,122 20,24,24,24,24  
29 133 6,30,54,78,102,126 24,24,24,24,24  
30 137 6,26,52,78,104,130 20,26,26,26,26  
31 141 6,30,56,82,108,134 24,26,26,26,26  
32 145 6,34,60,86,112,138 28,26,26,26,26  
33 149 6,30,58,86,114,142 24,28,28,28,28  
34 153 6,34,62,90,118,146 28,28,28,28,28  
35 157 6,30,54,78,102,126,150 24,24,24,24,24,24  
36 161 6,24,50,76,102,128,154 18,26,26,26,26,26  
37 165 6,28,54,80,106,132,158 22,26,26,26,26,26  
38 169 6,32,58,84,110,136,162 26,26,26,26,26,26  
39 173 6,26,54,82,110,138,166 20,28,28,28,28,28  
40 177 6,30,58,86,114,142,170 24,28,28,28,28,28  

位置合せパターンの位置は7の倍数型近くで増えているようなので、それをもとにして計算させるのもいいかもしれない。なんか複雑な計算しましたが、この表をそのまま取り込むのは避けられました。32型だけちょっと特殊かも。

最初の間隔が調整されてますね。6の位置などで、位置検出パターンと重なる場合には位置合せパターンは省略します。

これで、容量の計算もできます。

データ及び誤り訂正に使えるモジュール数は、

int getModuleSize() {
  int full = version * 4 + 16;
  full = full*full; // タイミングパターン、形式情報及びその誤り訂正符号を除外したサイズ
  full -= 64*3; // 位置検出パターン、位置検出パターンの余白パターン
  if (version > 1) {
    full -= 25 * ((version+7) / 7) * ((version+7) / 7); // 位置合せパターン
    full -= 20 * (version / 7) * 2; // タイミングパターン上の位置合せパターン
    if (version >=7) {
      full -= 36; // 型情報及びその誤り訂正符号
    }
  }
  return full; // データと誤り訂正に利用可能なモジュール数
}

で、容量にあわせて使う型を決めます。これを8で割るとバイト数。そのまえにデータをつくらないといけませんが…。

データは、文字、数値、バイナリ、のように何種類かの形で格納できます。エラー訂正も数種類あります。これを決めて何型にするかを決めます。

まぁ・・・そういうことで。JIS規格読むのが手っとり早い。

つくったら配布するかも?

参考

Get Thunderbird

[技術資料室] [フォーマット辞典]