はじめに
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 |