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.csdn.net/zengrenyuan/article/details/80282578