【クイックガイド】JavaによるQRコード生成


はじめに

Java で手っ取り早くQRコードを生成するクイックガイドです。


QRコードの生成

dependencies {
    implementation("com.google.zxing:javase:3.5.1")
}

com.google.zxing:core:3.5.1 は依存で勝手に入る。


QRCodeWriter から BitMatrix を作成する。 BitMatrix が 2D 行列のビットデータを表し、MatrixToImageWriter で画像データとして書き出しできる。

try {
    Writer writer = new QRCodeWriter();
    BitMatrix matrix = writer.encode(
            "https://www.google.com",
            BarcodeFormat.QR_CODE,
            25, 25);
    MatrixToImageWriter.writeToPath(matrix, "png", Path.of("qr.png"));
} catch (WriterException | IOException e) {
    throw new RuntimeException(e);
}

writer.encode() の最後の引数は推奨サイズ(int width, int height)をピクセル単位で指定(マージン含む)。 ただし、あくまで推奨サイズであり、QRコード自体の大きさは、後述のQRコードバージョンにより調整される。

QRコードバージョン2の場合は 25x25 であり、マージンを含めて 29x29 のセルが必要となる。 推奨サイズとして 29x29 で指定した場合は、QRコードのセルは 1x1 ピクセルとなる。 推奨サイズとして 68x68 を指定した場合は、QRコードのセルは 2x2 ピクセルになる。 推奨サイズとして 40x40 などを指定した場合は、 マージンの余白で調整され、サイズが不足する場合は推奨サイズは無視され1セル1ピクセルで必要なサイズに調整される。

29x29 40x40 68x68

QRコードのバージョンは、必要な誤り訂正レベルと、QRコードに含める文字種・文字数によって変わる(後述)。


バイトデータとして取得する場合は、OutputStream 経由で以下のように取得できる。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "png", baos);
baos.toByteArray();

画像フォーマットの指定は、内部で javax.imageio.ImageIO.write() を使っているため、ImageIO.getWriterFormatNames() で得られるものが利用できる。


エンコードヒントの指定

エンコードにはマップ形式でヒントを指定できる。

Map<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

BitMatrix matrix = writer.encode(
        "https://www.google.com",
        BarcodeFormat.QR_CODE,
        25, 25, hints);

主に使うのは以下となる。

  • EncodeHintType.QR_VERSION

    • QRコードバージョン
    • 1 から 40
  • EncodeHintType.ERROR_CORRECTION

    • 誤り訂正レベルを指定
    • サイズと文字数・文字種に応じて選択する(後述)
  • EncodeHintType.CHARACTER_SET

    • 文字セットを指定
    • デフォルトは ISO-8859-1
    • 必要に応じて設定
  • EncodeHintType.MARGIN

    • マージンを指定
    • デフォルトは 4
    • QRコードは周りに4セル以上の空白が必要
    • 自身でマージンを用意できる場合は0を指定できる


QRコードのバージョンと誤り訂正レベル

QRコードは 21x21 セルのバージョン1から、177x177 セルのバージョン40までが定義されている。

各バージョンは 4セル刻みで大きくなる。

誤り訂正レベルは以下の4つが選択できる。

  • ErrorCorrectionLevel.L
  • 7% まで訂正可能(デフォルト)
  • ErrorCorrectionLevel.M
  • 15% まで訂正可能
  • ErrorCorrectionLevel.Q
  • 25% まで訂正可能
  • ErrorCorrectionLevel.H
  • 30% まで訂正可能

QRコードに含めるデータ種別に応じて以下のいずれかが選択される。

  • Mode.NUMERIC
  • [0-9]
  • Mode.ALPHANUMERIC
  • [0-9A-Z $%*+-./:]
  • 小文字がある場合は Mode.BYTE が選択されるので注意
  • Mode.KANJI
  • Shift_JIS
  • 2バイトコードのみ
  • Mode.BYTE
  • バイトデータ


QRコードにするのは大抵URLだと思うので、ISO-8859-1(デフォルト)で Mode.BYTE として以下の表からバージョンと訂正レベルに応じた最大データ量を確認できる。

例えば https://www.google.com は小文字を含むので Mode.BYTE が選択され、ISO-8859-1 で 22バイトとなる。 バージョン1の場合、バイトは最大でも17なので不足。 バージョン2の場合は、訂正レベルL で32バイト、訂正レベルM で26バイトとなるので、この何れか、またはより高いバージョン(EncodeHintType.QR_VERSION)を使うことになる。

バージョン1(21x21)

訂正レベル 数字 英数記 漢字 バイト
L 41 25 10 17
M 34 20 8 14
Q 27 16 7 11
H 17 10 4 7

バージョン2(25x25)

訂正レベル 数字 英数記 漢字 バイト
L 77 47 20 32
M 63 38 16 26
Q 48 29 12 20
H 34 20 8 14

バージョン3(29x29)

訂正レベル 数字 英数記 漢字 バイト
L 127 77 32 53
M 101 61 26 42
Q 77 47 20 32
H 58 35 15 24

バージョン4(33x33)

訂正レベル 数字 英数記 漢字 バイト
L 187 114 48 78
M 149 90 38 62
Q 111 67 28 46
H 82 50 21 34

バージョン5(37x37)

訂正レベル 数字 英数記 漢字 バイト
L 255 154 65 106
M 202 122 52 84
Q 144 87 37 60
H 106 64 27 44

バージョン6(41x41)

訂正レベル 数字 英数記 漢字 バイト
L 322 195 82 134
M 255 154 65 106
Q 178 108 45 74
H 139 84 36 58