不谈情怀,直接就来我是如何实现的吧!! 环境介绍:我用到的Ireport5.1.0版本,需要用到的两个二维码生成jar包 1.javase.jar 2.core.jar 这两个jar包是二维码生成 zing.jar包里面的,也可以单独下载。 步骤1:在ireport打开页面中,选择“工具”选项,选择“classpath”,将javase.jar和core.jar这两个jar包导进来。如下图: 步骤2:新建一个【Image】属性的文本,选择图片路径时选择“取消”,这时候在“image Expression”框中添加“com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(new com.google.zxing.qrcode.QRCodeWriter().encode($P{QrCode},com.google.zxing.BarcodeFormat.QR_CODE,1000,1000))”字段。 其中:$P{QrCode}是二维码的内容,这个参数可以根据自己的实际情况来定 后面(1000,1000)是生成二维码图片的大小,尺寸是以像素计数的, 步骤3:通过报表设计,实际生成报表 我们都知道,二维码较一维码存储更多的内容,二维码内容过多的时候,像素比较密集,当图片过小的时候是很难扫出结果的,除了放大图片,提高像素比也是一个不错的选择。 生成的二维码到这里就可以实现啦!!!如图: 原以为大功告成!!可是发现远远不够,受限于报表的设计图片框的大小,生成的二维码较小,且周围还有白边浪费位置,扫描二维码也不容易扫出结果!!! 步骤4:去除白边
private static BitMatrix renderResult(QRCode code, int width, int height, int quietZone) { ByteMatrix input = code.getMatrix(); if (input == null) { throw new IllegalStateException(); } int inputWidth = input.getWidth(); //设置的宽度 int inputHeight = input.getHeight(); //设置的高度 int qrWidth = inputWidth + (quietZone << 1); int qrHeight = inputHeight + (quietZone << 1); int outputWidth = Math.max(width, qrWidth);//输出的宽度 int outputHeight = Math.max(height, qrHeight);//输出的高度 int multiple = Math.min(outputWidth / qrWidth, outputHeight / qrHeight); //比例 int leftPadding = (outputWidth - inputWidth * multiple) / 2; //左边距 int topPadding = (outputHeight - inputHeight * multiple) / 2; //上边距 BitMatrix output = new BitMatrix(outputWidth, outputHeight); int inputY = 0; for (int outputY = topPadding; inputY < inputHeight; outputY += multiple) { int inputX = 0; for (int outputX = leftPadding; inputX < inputWidth; outputX += multiple) { if (input.get(inputX, inputY) == 1) { output.setRegion(outputX, outputY, multiple, multiple); } inputX++; } inputY++; } return output; } } ```上面的代码是`QRCodeWrite`类里面生成二维码大小的设置,缩放比例会随二维码内容的大小而变动,我们不能只是简单的去除上边距和左边距,那样只会将二维码内容移动,而白边其实没有变化。 更好的方法是在`MatrixToImageWriter.toBufferedImage.`将`toBufferedImage`方法替换为如下方法: <div class="se-preview-section-delimiter"></div>这里写代码片 “`
public static BufferedImage toBufferedImage(BitMatrix matrix, MatrixToImageConfig config) { int[] rec = matrix.getEnclosingRectangle(); int resWidth = rec[2] + 1; int resHeight = rec[3] + 1; BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); resMatrix.clear(); for (int i = 0; i < resWidth; i++) { for (int j = 0; j < resHeight; j++) { if (matrix.get(i + rec[0], j + rec[1])) { resMatrix.set(i, j); } } } int width = resMatrix.getWidth(); int height = resMatrix.getHeight(); BufferedImage image = new BufferedImage(width, height, config.getBufferedImageColorModel()); int onColor = config.getPixelOnColor(); int offColor = config.getPixelOffColor(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, resMatrix.get(x, y) ? onColor : offColor); } } return image; }至此,生成的二维码成功的去除白边!!!! 注意:修改的文件要重新的打成jar包
