皆さんこんにちは。いいんちょです。

時々いいんちょとしてブログの記事を書いていますが、本職はDPS(詳しくはこちら)の一員として日々働いています。

さて、今回は作業中の出来事についてちょっとだけお話しします。

ある時お客さんから「QRコードを作成したいけど、同じ情報であればどこで作成しても同じQRコードができるんだよね?」と問合せを頂きました。

持ち合わせている知識として回答したのは「モデル、バージョン、誤り訂正レベルを合わせていただければ同じ情報を持つQRコードは作成できます。」

同じ形ではなく「同じ情報を持つQRコード」と言ったのは、実はトヨトモで所有しているQRコード変換ソフトによって同じ設定、同じ情報なのに違う配列のQRコードが作成されるのを知っていたからです。ただ読み取った内容は同じなので問題なしとしていました。

一度ソフトウエアメーカーに確認したこともあったのですが、「QRコードの作成アルゴリズムが違うからです。ただ読取りには問題ありません。」とざっくりとした回答を貰ったのみで、読取りに問題無いとしてもなんだかモヤモヤだけが残り今日に至ります。

ふむ。ならばQRコードを自分で作成してみて何が違うのか検証してみよう!って思いで安易にQRコード制作に踏み込んでみます。

まず、こちらが元凶の同じ設定(モデル2、バージョン1、誤り訂正レベルH)で2種類のソフトウエアで作成したQRコードです。

ソフトウエア1ソフトウエア2
software1software2

うん。違いますね。全然違います。

でも読み取ってみると、どちらも「TOYOTOMO」と表示されます。

それでは一つ一つ紐解いていきましょう。

今回は検証用にモデル2、バージョンを1、誤り訂正レベルをH(30%)としたQRコード「TOYOTOMO」を作成してみます。

最初に見た目ですが、特徴的なのが左上、右上、左下にある大きな四角。これは位置検出パターン(黒)といい、QRコードの位置と方向を決定します。またその大きな四角をつなぐような点線をタイミングパターン(赤)といい、QRコードの中心座標を決定します。また、大きな四角を囲むように形式情報(緑)が入り、その他の部分が、データコードが入る領域(水色)となります。バージョンによっては右下等に位置合わせパターンが入ります。

format

位置検出パターンとタイミングパターンは固定値なのでここが変わることはなさそうです。

次にバージョン1、誤り訂正レベルHのQRコードに対する情報を取得します。こちらはQRコードのJIS規格の表を参考にします。

○バージョン1、誤り訂正レベルHの場合は、

QRlist

データコード語数 9、誤り訂正コード語数 17、最大格納可能文字数(数字17、英数字10、8bit 7、漢字4)。

この辺りで意味不明な言葉が出てきますが、とりあえず次に進みます。

ここから情報をビット列に変換していくのですが、本来の目的がQRコードの違いの検証なので、ざっくりと行きます。

まず、英数字モードと文字数と「TOYOTOMO」を数値化して8bitで区切ります。

結果> 32 69 49 194 84 197 251 0 236

そこにリードソロモン誤り訂正方式を利用し誤り訂正コードを付与します。

JISによると

「QRコードの多項式は2を法とする算術及び100011101を法とする 算術(体の原始多項式 x8+x4+x3+x2+1 の係数を示す100011101を持つ 28のガロア体)を用いて計算する。データコード語は、多項式の項の係数で 最高次項を最初のデータコード語、最低次項を最終データ語とする。誤り訂正コード語は誤り訂正検出及び訂正で使用される多項式g(x)によってデータコード語を除算して得られた剰余とする。・・・うんぬんかんぬん」

リードソロモン、体の原始多項式、ガロア体・・・

安易に踏み込んではいけない領域だった感が漂います。

実際に数式を当てはめると「TOYOTOMO」を符号化した式が

f(x)= 32x25 + 69x24 +49x23 +194x22 +84x21+197x20+251x19+0x18+236x17

となり、そして誤り訂正データ語数17の生成多項式g(x)が

g(x)=x17 +α43x16 +α139x15 +α206x14 +α78x13 +α43x12239x11 +α123x10 +α206x9 +α214x8 +α147x7 +α24x699x5 +α150x4 +α39x3 +α243x2 +α163x +α136 

このf(x)をg(x)で除算し算出された余剰が誤り訂正コードになるそうです。

・・・・・・

ぁああ、すみません。飛行機雲を眺めてました。

現実と向き合いながら算出されたコードが以下です。

結果>187 143 162 131 0 27 228 83 58 28 206 3 213 187 213 31 230

この誤り訂正コードを付与し、データコード領域に配置していきます。

配置にも法則はありますが、これは処理により変わるものではありません。

さて、次です。

次はマスクパターン。データを配置したQRコードに白や黒が偏ったり、位置検出マーク等に近い配列のものがあったりするとよろしくないとのことで8種類あるマスクから最良のものを付与します。

最後に形式情報。

ここでまたあの多項式がでてきてf(x)やらg(x)などと格闘しますが、こちらも検証とは関係無さそうなので割愛です。その形式情報をQRコードに配置して完成です。

toyoQR01

ふぅ。なんだかんだとありましたが、本来の目的。QRコードの違いの原因を探りましょう。

ただ、作成途中に薄々感づいてはいましたが・・。

とりあえず自作したプログラム「toyoQR」に設定を入れてみます。

toyoQR

通常のソフトには無い項目がありますよね。そう、これが正体です。

マスクパターン101( (xy) mod 2 + (xy) mod 3)で作成すると、

最初のソフトウエア1で作成したQRコードと同じです。

toyoQRソフトウエア1
toyoQR02software1

続いてマスクパターン111(((xy) mod 3 + (x+y) mod 2) mod 2)

toyoQRソフトウエア2
toyoQR03 software2

 同じですね。

つまり、QRコードを読取り易くするために掛けるマスクの評価式の違いにより選択されるマスクパターンが異なり、同じ内容でも見た目が違うQRコードが生成されたということでした。

結果だけ見てみると簡単なことでしたが、QRコードに少しだけ歩み寄れた気がします。

以上、いいんちょでした。

※QRコードは(株)デンソーウェーブの登録商標です。

この記事を書いた人

いいんちょ
トヨトモHP管理委員会の委員長を任されています、いいんちょです。みなさんにトヨトモの魅力を知って頂けるよう、商品情報から活動報告まで、肩の力を抜いて読んで頂けるブログを目指します。