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