com.google.zxing.qrcode.QRCodeWriter
を使用してデータをエンコードし、com.google.zxing.client.j2se.MatrixToImageWriter
を使用してQRコードイメージを生成しています。 400x400の画像では、コードの周りに約52ピクセル幅の境界線があります。この境界線をもっと狭く、おそらく15ピクセルにしたいのですが、それを行うためのAPIには何も表示されません。ドキュメンテーションに何かが欠けていますか?または、自分で画像を処理する必要がありますか?
参考までに、ZXingライブラリで生成された400x400 QRコードの例を次に示します。
QR仕様には4つのモジュールのクワイエットゾーンが必要です。これが zxingが作成 です。 ( QRCodeWriter.renderResult の_QUIET_ZONE_SIZE
_を参照してください。)
ZXingのより新しいバージョンでは、 _EncodeHintType.MARGIN
_ キーでint値を指定することにより、クワイエットゾーンのサイズ(基本的にQRコードの組み込みパディング)を設定できます。 Map
の- encode(...)
メソッドに提供するヒントWriter
にそれを含めるだけです:
_Map<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 2); /* default = 4 */
_
これを変更すると、デコード成功率が低下する危険があります。
EncodeHintType.MARGIN
を0
に設定しても、QRCodeの「ドット」行列をピクセルデータに変換するアルゴリズムは小さなマージンを生成できます(アルゴリズムはドットごとに一定数のピクセルを強制するため、マージンピクセルサイズQRコードのドットサイズによるピクセルサイズの整数除算の残りです)。
ただし、この「ドットからピクセルへ」の生成を完全にバイパスできます。publiccom.google.zxing.qrcode.encoder.Encoder
クラスを呼び出してQRCodeドットマトリックスを直接計算し、ピクセルイメージを自分で生成します。以下のコード:
// Step 1 - generate the QRCode dot array
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCode qrCode = Encoder.encode(what, ErrorCorrectionLevel.L, hints);
// Step 2 - create a BufferedImage out of this array
int width = qrCode.getMatrix().getWidth();
int height = qrCode.getMatrix().getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray = new int[width * height];
int i = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
rgbArray[i] = qrCode.getMatrix().get(x, y) > 0 ? 0xFFFFFF : 0x000000;
i++;
} }
image.setRGB(0, 0, width, height, rgbArray, 0, width);
BufferedImage
からPNGデータへの変換は、読者への課題として残されています。ドットあたりの固定ピクセル数を設定して、画像を拡大縮小することもできます。
通常、そのように最適化され、生成される画像サイズは可能な限り小さくなります。画像を拡大縮小するためにクライアントに依存している場合(ぼかしなし)、ドットごとに1ピクセルを超える必要はありません。
HashMap hintMap = new HashMap();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
hintMap.put(EncodeHintType.MARGIN, -1);
マージンなし
[〜#〜] update [〜#〜]
依存関係の追加(コメントから)
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
Swiftでは、次のことができます。
let hints = ZXEncodeHints()
hints!.margin = NSNumber(int: 0)
let result = try writer.encode(code, format: format, width: Int32(size.width), height: Int32(size.height), hints: hints)
let cgImage = ZXImage(matrix: result, onColor: UIColor.blackColor().CGColor, offColor: UIColor.clearColor().CGColor).cgimage
let QRImage = UIImage(CGImage: cgImage)