减少ZXing生成的QR码的边框宽度?

时间:2012-04-13 14:30:01

标签: zxing

我正在使用com.google.zxing.qrcode.QRCodeWriter对数据进行编码,使用com.google.zxing.client.j2se.MatrixToImageWriter来生成QR代码图像。在400x400图像上,代码周围有大约52像素宽的边框。我希望这个边框更窄,可能是15像素,但我没有在API中看到任何内容。我在文档中遗漏了什么吗?或者我需要自己处理图像吗?

供参考,以下是使用ZXing库生成的400x400 QR Code示例:

An example QR Code

4 个答案:

答案 0 :(得分:68)

QR规范需要一个四模块静区,这就是zxing creates。 (请参阅QRCodeWriter.renderResult中的QUIET_ZONE_SIZE。)

ZXing的更新版本允许您通过使用EncodeHintType.MARGIN键提供int值来设置静区的大小(基本上是QR码的内部填充)。只需将其包含在您提供给Map的{​​{3}}方法的提示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 */

如果更改此设置,则可能会降低解码成功率。

答案 1 :(得分:9)

即使将EncodeHintType.MARGIN设置为0,将QRCode“点”矩阵转换为像素数据的算法也会产生较小的余量(该算法会强制每个点的像素数为常数,因此边缘像素大小是QR码代码点大小的像素大小的整数除法的剩余部分。

然而,您可以完全绕过这种“点到像素”生成:通过调用公共com.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个像素。

答案 2 :(得分:1)

    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>

答案 3 :(得分:1)

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)