google zxing生成的二维码有时候会出现留白太多

针对googlezxing生成的二维码留白过多的问题,介绍了一种调整QRCodeWriter中width和height参数的方法,通过重新计算合理宽度,有效控制留白,保持二维码美观且适合打印。

google zxing生成的二维码有时候会出现留白太多,特别丑,也不适合打印。

跟踪后发现是QRCodeWriter中QRCode code = Encoder.encode(contents, errorCorrectionLevel, hints); 生成的QRCode的width和height 与 期望的相差太大,然后renderResult方法生成的BitMatrix对象就会存在大量的留白。

解决办法:

在QRCodeWriter类调用renderResult之前重新设置width和height,将留白控制在某个数值以内,如10像素
  /**
   * 因为renderResult方法存在leftPadding和topPadding留白特别大的问题, 重新计算1个更合理的二维码宽度
   * @param inputWidth, 二维码时间的宽度 
   * @param width, 二维码包括留白一起总共的宽度
   * @param quietZone, 默认间隙
   * @return, 合理的二维码的宽度
   */
  private static int getWidth(int inputWidth, int width, int quietZone) {
    if(width != inputWidth) {
        int max = Math.max(width, inputWidth);
        int min = Math.min(width, inputWidth) + quietZone * 2;
        if(max % min > quietZone * 2) {
            width = min*(max / min + 1);
        }
    }
    return width;
  }


        // 解决二维码留白有可能太大的问题,先修改width和height以控制留白
        width = getWidth(input.getWidth(), width, quietZone);
        height = width;
        return renderResult(code, width, height, quietZone);

如果想控制最终生成的二维码图片的尺寸保持原来的不变,则可以在ImageIO.write()之前对BufferedImage进行缩放为原来的尺寸即可。

网上也有另外一种方法: 修改BitMatrix对象  https://blog.youkuaiyun.com/zengrenyuan/article/details/80282578

在Java中使用ZXing生成二维码图片时,可以通过设置二维码的参数来调整留白ZXing库允许用户自定义二维码的各种属性,包括留白的大小。通常,留白(quiet zone)指的是二维码边缘的空白区域,它有助于扫描设备识别二维码的边界。 具体操作步骤如下: 1. 创建一个`QRCodeWriter`实例。 2. 使用`encode`方法生成二维码编码时,传入特定的参数设置`EncodeHintType.MARGIN`为0来去掉留白。 3. 将编码后的二维码数据写入`BitMatrix`对象。 4. 利用`MatrixToImageWriter`将`BitMatrix`对象渲染为图片,此时已经没有留白。 下面是一个示例代码片段: ```java import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.client.j2se.MatrixToImageWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { public static void main(String[] args) throws WriterException, IOException { Map<EncodeHintType, Integer> hints = new HashMap<>(); // 设置无留白 hints.put(EncodeHintType.MARGIN, 0); BitMatrix bitMatrix = new MultiFormatWriter().encode( "Some data here", BarcodeFormat.QR_CODE, 300, // 图片宽度 300, // 图片高度 hints); // 将BitMatrix渲染为图片并输出到文件,这里没有留白 MatrixToImageWriter.writeToStream(bitMatrix, "PNG", System.out); } } ``` 注意,虽然去除留白可以使二维码看起来更加紧凑,但是在实际应用中,建议保留一定的留白。这是因为扫描设备在识别二维码时需要一定的边缘区域作为参考点,过小的留白可能会导致扫描失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值