【Java】二次元コード(QRコード)の作成/読取のサンプル紹介

今回は、「二次元コード(QRコード)」の作成と読取を行うことができるライブラリを紹介していきます。使用するライブラリは「ZXing」になります。

ZXing」は、Javaで実装されているオープンソースで、ライセンスは「Apache License 2.0」になります。一次元コード(バーコードなど)、二次元コード(QRコードなど)の作成/読取を行うことができる画像処理ライブラリになります。Java以外の他の言語への移植も可能になっています。

GitHub - zxing/zxing: ZXing ("Zebra Crossing") barcode scanning library for Java, Android
ZXing ("Zebra Crossing") barcode scanning library for Java, Android - zxing/zxing
スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Java
    • バージョン:11
  • ZXing Core
    • バージョン:3.4.1
  • ZXing Java SE Extensions
    • バージョン:3.4.1

プログラム例

作成処理

作成処理は、次の条件で二次元コードを作成するプログラム例になります。

【条件】

  • URLの「https://fumidzuki.com」をエンコードした情報を作成します。
  • 作成した二次元コードの画像は、幅256ピクセル、高さ256ピクセルで作成します。
package com.fumidzuki.example;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class WriterExample {

  public static void main(String[] args) {
    String contents = "https://fumidzuki.com";
    try {
      QRCodeWriter writer = new QRCodeWriter();
      BitMatrix bitMatrix = writer.encode(contents, BarcodeFormat.QR_CODE, 256, 256);
      BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
      ImageIO.write(image, "png", new File("example.png"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

「QRCodeWriter」の「encode」メソッドは、次の情報を指定してビットマップ情報の取得処理を実施します。

  • コンテンツ情報
  • フォーマット情報
  • 作成する画像サイズ(幅)
  • 作成する画像サイズ(縦)

「MatrixToImageWriter」の「toBufferedImage」メソッドは、ビットマップ情報から画像情報の作成処理を実施します。

「ImageIO」の「write」メソッドは、次の情報を指定して画像ファイルの出力処理を実施します。

  • 画像情報
  • 画像フォーマット
  • 出力先

作成に成功すると、次のような画像情報を確認することができます。スマートフォンなどで二次元コードを読み取るとコンテンツ情報を取得することができます。

作成した二次元コード

読取処理

読取処理は、「作成処理」で作成した画像ファイルから。コンテンツ情報を取得するプログラム例になります。

package com.fumidzuki.example;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

public class ReaderExample {

  public static void main(String[] args) {
    File file = new File("example.png");
    try {
      BufferedImage image = ImageIO.read(file);
      LuminanceSource source = new BufferedImageLuminanceSource(image);
      Binarizer binarizer = new HybridBinarizer(source);
      BinaryBitmap bitmap = new BinaryBitmap(binarizer);
      QRCodeReader reader = new QRCodeReader();
      Result result = reader.decode(bitmap);
      System.out.println(result.getText());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

「ImageIO」の「read」メソッドは、画像ファイルの読取処理を実施します。

「BufferedImageLuminanceSource」は、画像情報をグレースケールへの変換処理を実施します。

「HybridBinarizer」は、指定した画像情報の解析処理を実施するアルゴリズムになります。

「BinaryBitmap」は、指定した画像解析アルゴリズムを使用して、二次元コードで処理するためのビットマップ情報の作成処理を実施します。

「QRCodeReader」の「decode」メソッドは、二次元コードの解析結果の取得処理を実施します。

「Result」は、二次元コードを解析結果を保持するオブジェクトになります。「getText」メソッドを使用することで、コンテンツ情報を取得することができます。

作成した処理を実行すると、次のような情報がコンソールに表示されます。

https://fumidzuki.com

処理結果から「作成処理」で作成した画像ファイルからコンテンツ情報を取得できたことを確認することができます。

プログラム例(マルチバイト)

二次元コードを作成するときに、マルチバイト文字(日本語など)を含めることもできます。

作成処理

作成処理は、前に説明した「作成処理」とほとんど同じ内容になりますが、「QRCodeWriter」の「encode」メソッドを実行するときのパラメータを追加する必要があります。作成するプログラム例は、次のようになります。

package com.fumidzuki.example;

import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class WriterExample {

  public static void main(String[] args) {
    String contents = "マルチバイト文字は解析できるかな?";
    Map<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8);
    try {
      QRCodeWriter writer = new QRCodeWriter();
      BitMatrix bitMatrix = writer.encode(contents, BarcodeFormat.QR_CODE, 256, 256, hints);
      BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
      ImageIO.write(image, "png", new File("example.png"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

「QRCodeWriter」の「encode」メソッドに、追加引数として「java.util.Map」のパラメータを指定しています。指定できるパラメータについては、「ZXing」のJavadocを確認してください。

EncodeHintType (ZXing 3.5.3 API)

マルチバイト文字列を含めるときは、「java.util.Map」に次の情報を指定します。

  • キー:EncodeHintType.CHARACTER_SET
  • 値:文字コード

プログラム例では、「文字コード = UTF-8」となる「StandardCharsets.UTF_8」を指定しています。パラメータを指定しない場合の文字コードは、「ISO-8859-1」になります。

読取処理

読取処理は、前に説明した「読取処理」と同じ内容になります。マルチバイト文字の読取処理では、特別な処理を追加する必要はありません。

まとめ

二次元コードの作成/読取を行うことができる「ZXing」ライブラリを紹介しました。