この記事は2019年9月22日に開催された技術書典7にて頒布した「KLabTechBook Vol.5」に掲載したものです。

現在開催中の技術書典15オンラインマーケットにて新刊「KLabTechBook Vol.12」を頒布(電子版無料、紙+電子 500円)しています。 また、既刊も在庫があるものは物理本をオンラインマーケットで頒布しているほか、 KLabのブログからもすべての既刊のPDFを無料DLできます。 合わせてごらんください。

KLabTechBook Vol.12


2次元コードの世界

QRコードの登場から25年、2次元コードはもはや私達の生活に不可欠なほどよく使われるようになりました。 ところで、バーコードにさまざまな規格があるように、2次元コードにも数々の規格があることをご存知でしょうか。

身近なところでは地方自治体からの通知にSPコードUni-Voiceという視覚障害者向けの音声コードが印字されているのを見たことがあると思います。 また、航空券にPDF417が印字されているのをたまに見かけますし、他にもAztecMaxiCode、 変わったところではHCCBカメレオンコードといったカラフルなものもあります。 図1にいくつか挙げてみました1

さまざまな2次元コード. A: Uni-Voice; B: PDF-417; C: Aztec; D: HCCB
▲図1 さまざまな2次元コード. A: Uni-Voice; B: PDF-417; C: Aztec; D: HCCB

この章では、電子機器や医療機器産業の分野でよく使われているDataMatrixについて、 QRコードと比較しながら紹介したいと思います。

ノートPCに貼られているDataMatrix
▲図2 ノートPCに貼られているDataMatrix

DataMatrixとは

DataMatrixは、QRコードと同じく白黒の四角(セル)を並べてテキストデータや数値データを表現する2次元コードで、 QRコードの登場より約7年早い1987年にID Matrix社により開発されました。

その後、歪み補正やエラー訂正機能を強化したECC 200というバージョンが策定され、このバージョンが広く使われています。 QRコードがISO規格(ISO/IEC 18004)となった2000年に、DataMatrixもISO規格(ISO/IEC 16022)となりました。 このISO規格をもとにJIS規格(JIS X 0512)にもなっています。

DataMatrixは最小10×10セルから最大144×144セルで、 一般的な英文(アルファベットの大文字小文字と数字、いくつかの記号)であれば最大2,335文字を格納できます。 また、正方形だけでなく長方形のパターンも用意されており、細長い領域への印字もしやすくなっています。

長方形のDataMatrix
▲図3 長方形のDataMatrix

それでは、DataMatrixの特徴についてQRコードと比較しながら見ていきましょう。

検出パターン

QRコードには特徴的な3つの検出パターンがあり、これを目印としてQRコードを検出します。 一方、DataMatrixの検出パターンは左下のL字の直線部分のみです。 上と右にはタイミングパターンとして白と黒のセルが交互に配置されています。 大きなサイズのDataMatrixでは、データ領域が分割されて直線と白黒交互のセルからなる位置合わせパターンが挿入されます。

DataMatrixの固定パターン. 右は位置合わせパターンのあるもの
▲図4 DataMatrixの固定パターン. 右は位置合わせパターンのあるもの

DataMatrixの固定パターンはこれだけで、内側はすべてデータ領域となっています。 QRコードに比べて固定パターンの占める割合が少ないため、より小さいサイズに多くの情報を格納できるようになっています。 一方で、L字のパターンはQRコードのように判別しやすいパターンではないため、検出精度は劣ります。

エラー訂正符号

DataMatrixにおいてもQRコードと同じく、エラー訂正符号としてリード・ソロモン符号が使われています。

リード・ソロモン符号は一定数ビットを1ワードとして、ワード単位でのエラー訂正を行う符号です。 DataMatrixとQRコードはどちらも8ビットを1ワードとしています。 この符号では1ワードのうち何ビットのエラーがあったとしても1ワードのエラーとして扱われるため、 連続して起こるバーストエラーに強いという特徴があります。 これは、印刷したときに一部がかすれたり剥がれたりというエラーに対して強いため、 2次元コードにはとても向いている性質です。

QRコードの場合はエラー訂正レベルをL、M、Q、Hの4段階から選択することができますが、 DataMatrixではサイズによって自動的に決まり、 10×10でもっとも高く約66%、もっとも低くなる132×132でも約19%のエラーを訂正することができます。 QRコードにおいてはLでの約7%からHの約30%なので、同等以上の十分なエラー訂正能力があるといえます。

データの配置方法

リード・ソロモン符号のバーストエラーに強いという性質を最大限に活かすためには、 1ワードができるだけまとまった位置にあるのが望ましいです。

DataMatrixでは3×3の正方形から右上を切り欠いた、いわゆるユタ州型として1ワードをまとめます。 一方QRコードでは基本的に2×4の縦長に1ワードをまとめるため、DataMatrixの方がエラー耐性がわずかに高いと考えられます。

しかし、ユタ州型を隙間なく並べるには工夫が必要で、 DataMatrixでは右上の切り欠きに隣の文字の左下をはめ込み、図5のように斜めに往復するように並べていきます。 そしてデータ領域からはみ出る部分は、反対側の辺のちょうどはまり込む空き領域に配置します。 この配置の決定方法はISOやJISに図とC言語のコードで掲載されています。

ワードの配置順. 右下のセルが斜めの線上に並ぶように配置する
▲図5 ワードの配置順. 右下のセルが斜めの線上に並ぶように配置する

エンコード方式

QRコードにはデータを1バイトずつそのまま格納する8ビットバイトモードの他に、 英数字モードや漢字モードといった文字種を制限して効率よく格納するモードがあります2。 DataMatrixでも同様に、1バイトをそのまま格納するBase256モードの他、 ASCIIC40テキストX12EDIFACTというモードがあり、 最適なモードに切り替えながらエンコードしていきます。

ここで、”http://klabgames.tech.blog.jp.klab.com/“をエンコードする例をリスト1に示します。

▼リスト1 URLをエンコード

(ASCIIモードで開始)
01101001            h=105
01110101            t=117
01110101            t=117
01110001            p=113
00111011            :=59
00110000            /=48
00110000            /=48
11101111            (テキストモードへ移行)
10011001 11110111   k=24 l=25 a=14;     (24*1600)+(25*40)+14+1 = 153*256 + 247
01100000 11101111   b=15 g=20 a=14;     (15*1600)+(20*40)+14+1 =  96*256 + 239
10100101 01110001   m=26 e=18 s=32;     (26*1600)+(18*40)+32+1 = 165*256 + 113
00001000 01101010   .=(shift2),13 t=33; ( 1*1600)+(13*40)+33+1 =   8*256 + 106
01110011 00010110   e=18 c=16 h=21;     (18*1600)+(16*40)+21+1 = 115*256 +  22
00001000 01011000   .=(shift2),13 b=15; ( 1*1600)+(13*40)+15+1 =   8*256 +  88
10100000 10110101   l=25 o=28 g=20;     (25*1600)+(28*40)+20+1 = 160*256 + 181
00001000 01100000   .=(shift2),13 j=23; ( 1*1600)+(13*40)+23+1 =   8*256 +  96
10110101 01110110   p=29 .=(shift2),13; (29*1600)+( 1*40)+13+1 = 181*256 + 118
10011001 11110111   k=24 l=25 a=14;     (24*1600)+(25*40)+14+1 = 153*256 + 247
01011101 11110110   b=15 .=(shift2),13; (15*1600)+( 1*40)+13+1 =  93*256 + 246
01101000 01111011   c=16 o=28 m=26;     (16*1600)+(28*40)+26+1 = 104*256 + 123
11111110            (ASCIIモードへ戻る)
00110000            /=48

最初の7文字がASCIIモードのままなのは、テキストモードでは記号1文字あたり10.67ビット必要なので、 ASCIIモードのままの方が短くなるためです。 また最後の”/“はテキストモードの3文字区切りに合わないため、ASCIIモードに戻って符号化されます。

QRコードではマスクを掛けてデータを配置しますが、DataMatrixではこのビット列をそのままデータ領域に配置します。 そのため、図6のように対応する配置図が脳内にあれば3、人力でも簡単に読み取ることができます。

URLを格納したDataMatrixと各ビットの配置
▲図6 URLを格納したDataMatrixと各ビットの配置

なぜQRコードのほうが普及しているのか

QRコード自体が日本生まれということもあり、日本国内においてはQRコードのほうが普及しやすかったのは当然でしょう。 海外でも特に中国において、決済サービスなどでQRコードが広く使われていることはみなさんも聞いたことがあると思います。 一方、アメリカではDataMatrixが使われることが多いという話もありますが、 最近ではTwitterやFacebookなどがアカウント共有にQRコードを採用しているように、 どうやらQRコードが主流となっているように思われます。

本章で紹介してきたように、データの表現力やエラー訂正レベルの点ではDataMatrixもQRコードも決定的な差はなく、 DataMatrixが優っているのはデータの集積度、 つまり小さいサイズでより多くの情報を表示することができるという点です。 しかし、現在二次元コードがもっともよく使われているのは、URLのような短いテキストを共有するという用途で、 データ集積度を気にするほどのデータの大きさではないのではないでしょうか。

一方QRコードが大きく勝っているのは、判別しやすい検出パターンを採用したことによる検出精度の高さでしょう。 モバイル端末で手軽に素早く読み取るためにも、検出精度の高さが重要視されているのではないでしょうか。

まとめ

本章ではDataMatrixという二次元コードをQRコードと比較しながら紹介しました。 普段あまり見かけることのないDataMatrixですが、基本的にはQRコードと似たようなものです。 見かけたときはぜひDataMatrix対応のリーダーで読み取ってみてください。