49

com.google.zxing.qrcode.QRCodeWriterデータのエンコードとcom.google.zxing.client.j2se.MatrixToImageWriterQRコード画像の生成に使用しています。400x400の画像では、コードの周囲に約52ピクセル幅の境界線があります。この境界線を15ピクセル程度に狭くしたいのですが、APIにはそれを行うための何も表示されません。ドキュメントに何かが欠けていますか?または、画像を自分で処理する必要がありますか?

参考までに、ZXingライブラリで生成された400x400QRコードの例を次に示します。

QRコードの例

4

4 に答える 4

93

QR仕様には、4モジュールのクワイエットゾーンが必要であり、それがzxingが作成するものです。(QRCodeWriter.renderResultQUIET_ZONE_SIZEを参照してください。)

ZXingの最近のバージョンでは、EncodeHintType.MARGINキーにint値を指定することで、クワイエットゾーンのサイズ(基本的にはQRコードの固有のパディング)を設定できます。のメソッドにMap提供するヒントにそれを含めるだけです。例:Writerencode(...)

Map<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 2); /* default = 4 */

これを変更すると、デコードの成功率が低下するリスクがあります。

于 2012-04-13T14:53:33.237 に答える
12

に設定EncodeHintType.MARGINしても0、QRCodeの「ドット」マトリックスをピクセルデータに変換するアルゴリズムは、小さなマージンを生成できます(アルゴリズムはドットごとに一定数のピクセルを強制するため、マージンのピクセルサイズはピクセルサイズの整数除算の残りです。 QRコードドットサイズによる)。

ただし、この「ドットからピクセルへ」の生成を完全にバイパスできます。パブリッククラスを呼び出してQRCodeドットマトリックスを直接計算し、com.google.zxing.qrcode.encoder.Encoder自分でピクセル画像を生成します。以下のコード:

// 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);

PNGデータへの変換はBufferedImage、読者の練習問題として残されています。ドットあたりのピクセル数を固定して、画像を拡大縮小することもできます。

通常、この方法でより最適化され、生成される画像サイズは可能な限り最小になります。画像の拡大縮小をクライアントに依存している場合(ぼかしなし)、ドットあたり1ピクセルを超える必要はありません。

于 2013-02-14T10:58:26.163 に答える
6
    HashMap hintMap = new HashMap();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
    hintMap.put(EncodeHintType.MARGIN, -1);

マージンなし

アップデート

依存関係を追加する(コメントから)

<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>
于 2015-04-21T16:13:21.503 に答える
1

迅速に次のことができます。

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)
于 2015-10-30T16:11:25.093 に答える