用ireport生成二维码及去除二维码白边

news/2024/11/8 9:16:59/

不谈情怀,直接就来我是如何实现的吧!!
环境介绍:我用到的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包


http://www.ppmy.cn/news/665136.html

相关文章

几种去除PDF白边的方法

使用Adobe Acrobat。优点本地化处理&#xff0c;不产生流量&#xff1b;缺点需要软件授权&#xff0c;注意Acrobat不是Adobe Reader。 打开PDF文档选择“工具”>“页面”>“裁剪” 勾选删除白边即可 使用在线pdfresizer工具。优点方便快捷&#xff0c;无需依赖本地软件&a…

AI只调整填充色的透明度

先采用上述方案吧&#xff1b;&#x1f446; 没有找到这个按钮&#xff1a; “使用外观属性框”

设置 文本框 自动填充背景颜色 为白色

关于autofill伪类的 兼容性&#xff1a; 在现代浏览器中&#xff0c;包括Chrome、Safari、Firefox等&#xff0c;都支持:autofill伪类&#xff0c;但在使用时必须加上浏览器前缀-webkit-&#xff0c;即:-webkit-autofill。 在旧版的浏览器中&#xff0c;可能不支持:autofill伪…

Maven高级操作--分模块设计、聚合、继承和私服

一、分模块设计与开发 1.1 分模块设计 问题&#xff1a;当项目做大做强的时候&#xff0c;前面的基础Spring开发的框架都无法满足java大型项目的维护和复用&#xff0c;而且团队合作也会造成较大的困难。所以就需要分模块设计&#xff1a;将项目按照功能拆分成若干个子模块&a…

SpringBoot3之GraalVM之Windows详细安装及使用教程

配置Maven环境变量 我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 %MAVEN_HOME%\bin安装Visual Studio Community 因为GraalVM需要调用操作系统的底层工具&#xff0c;而Windows底层工具是VisualStudio&#xff0c;所以我们要先下载…

在上海做什么赚钱快?这10个你可以试一试!

现在生活压力越来越大&#xff0c;工作也越来越难找&#xff0c;尤其是想找一个各方面都比较合适的更是难上加难&#xff0c;因此&#xff0c;很多人就选择在家创业&#xff0c;那么在家创业都干什么比较赚钱呢?在上海做什么赚钱快&#xff1f;这10个你可以试一试&#xff01;…

关于Jetpack DataStore(Proto)的六点疑问

前言 上篇分析了DataStore(Preferences)的使用与原理&#xff0c;本篇接着阐述DataStore的另一种实现形式&#xff1a;DataStore(Proto)。 通过本篇文章&#xff0c;你将了解到&#xff1a; 1. 为什么需要Proto&#xff1f; DataStore(Preferences)对标SharedPreferences&a…

使用Node.js开发服务器进行请求转发和CORS处理

在Web开发过程中&#xff0c;我们经常会遇到需要在前端应用中与不同的API或后端服务进行通信的情况。然而&#xff0c;由于浏览器的同源策略限制&#xff0c;跨域请求会受到CORS&#xff08;跨域资源共享&#xff09;策略的限制。为了解决这个问题&#xff0c;我们可以使用Node…