Java

ZXingを使ってDataMatrixコードの生成/読み取りを行う

ZXing_DataMatrixコードの生成と読み取りを行う

前回の記事では、ZXingを使ってQRコードを生成する方法を解説しました。

ZXingを使ってQRコードの生成/読み取りを行うURLやSNSのIDなど、さまざな情報を共有できる手段として QRコード は浸透してきました。人間にはそのQRコードに格納された情報を理...

本稿では、二次元コードを生成できる Java のライブラリ ZXing を使って、DataMatrix コードを生成/読み取りする方法について解説します。

こんな人におすすめ
  • DataMatrixコードを製品管理に利用したい
  • QRコード以外の二次元コードに興味がある

DataMatrixとは

Embed from Getty Images

白黒のセルを正方形または長方形に配置したマトリクス型2次元コードで、情報密度が非常に高く、誤り訂正率も高いことから、アメリカでは部品のマーキングに使用されています。日本国内ではあまり目にしませんが、海外の工業製品では珍しくありません。

DataMatrixには、ECC000、ECC050、ECC080、ECC100、ECC140という古いバージョンとECC200の新しいバージョンがあり、現在はECC200が標準的に使用されています。

ちなみにhynixのSDRAMにプリントされていたDataMatrixには「80AD01183513001000」と記録されていました。シリアルナンバーと思われます。

hynixのSDRAMのラベル

セットアップ

ZXingはGithubのページ https://github.com/zxing/zxing ではjarが配布されていません。Mavenのリポジトリよりダウンロードできるので、core-*.*.*.jar と javase-*.*.*.jar をダウンロードしてクラスパスに追加してください。

https://repo1.maven.org/maven2/com/google/zxing/core/3.4.0/core-3.4.0.jar

https://repo1.maven.org/maven2/com/google/zxing/javase/3.4.0/javase-3.4.0.jar

Mavenを使用する場合は、pom.xmlに以下の定義を追加してください。

pom.xml

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.0</version>
</dependency>

サンプルソース

基本

生成処理

以下のソースはDataMatrixWriterを使って、URL「http://develman.net」をQRコードにエンコードして、「datamatrix.png」という画像ファイルに出力するサンプルです。以降の生成処理の解説のベースとしています。

Java

package net.develman.barcode;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.datamatrix.DataMatrixWriter;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

public class ZxingDataMatrixWriterExample {

    public static final void main(String[] args) {
        String content = "https://develman.net";
        int width = 200;
        int height = 200;
        String output = "datamatrix.png";

        try {
            DataMatrixWriter writer = new DataMatrixWriter();

            //DataMatrixWriter#encode()には以下の情報を渡す
            // (1)エンコード対象の文字列、バーコードに埋め込みたい情報
            // (2)出力するバーコードの書式
            // (3)イメージの幅
            // (4)イメージの高さ
            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.DATA_MATRIX, width, height);

            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

            //エンコードで得られたイメージを画像ファイルに出力する
            ImageIO.write(image, "png", new File(output));

        } catch (IOException e) {
            System.err.println("[" + output + "] を出力するときに例外が発生.");
            e.printStackTrace();
        }
    }
}

上のコードを実行すると画像ファイルとして得ることができます。

読み取り処理

以下のソースはDataMatrixReaderを使って、「datamatrix.png」という画像ファイルをデコードしてURL「http://develman.net」を読み取るサンプルです。

Java

package net.develman.barcode;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.datamatrix.DataMatrixReader;
import com.google.zxing.qrcode.QRCodeReader;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ZxingDataMatrixReadExample {

    public static final void main(String[] args) {
        String input = "datamatrix.png";

        try {
            //画像データを読み込む
            BufferedImage image = ImageIO.read(new File(input));
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            Binarizer binarizer = new HybridBinarizer(source);
            BinaryBitmap bitmap = new BinaryBitmap(binarizer);

            DataMatrixReader reader = new DataMatrixReader();

            //DataMatrixReader#decode()には以下の情報を渡す
            // (1)読み込んだイメージ
            Result result = reader.decode(bitmap);

            System.out.println(result.getText());

        } catch (NotFoundException e) {
            System.err.println("[" + input + "] イメージの中にバーコードが見つからないためデコードで例外が発生.");
            e.printStackTrace();
        } catch (ChecksumException e) {
            System.err.println("[" + input + "] バーコードが見つかったがチェックサム検査で例外が発生.");
            e.printStackTrace();
        } catch (FormatException e) {
            System.err.println("[" + input + "] は書式不正のためデコードで例外が発生.");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("[" + input + "] を読み込むときに例外が発生.");
            e.printStackTrace();
        }
    }
}

実行結果

https://develman.net

正方形で生成する

encode時にエンコードヒントを指定します。

生成処理

Java

String content = "https://develman.net";

Hashtable hints = new Hashtable();
hints.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);

DataMatrixWriter writer = new DataMatrixWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.DATA_MATRIX, 200, 200, hints);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, "png", new File("datamatrix1.png"));

EncodeHintType.DATA_MATRIX_SHAPESymbolShapeHint.FORCE_SQUAREに指定すると正方形で生成されます。

DataMatrix_Square

長方形で生成する

encode時にエンコードヒントを指定します。

生成処理

Java

String content = "https://develman.net";

Hashtable hints = new Hashtable();
hints.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_RECTANGLE);

DataMatrixWriter writer = new DataMatrixWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.DATA_MATRIX, 400, 200, hints);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, "png", new File("datamatrix2.png"));

EncodeHintType.DATA_MATRIX_SHAPESymbolShapeHint.FORCE_RECTANGLEに指定すると長方形で生成されます。

DataMatrix_Rectangle

補足

QRコードではエラー訂正レベルを4段階で指定することができましたが、DataMatrixコードでは指定できません。DataMatrixコードは、シンボルサイズ、データ量によって誤り訂正率が自動的に決定されます。

ABOUT ME
sasakiyu
ひ弱で優しい少年だったが、デーモンと合体。 強大な力を得つつも人間の心を失わないデベルマンとなる。