这个例子需要使用google的开源项目zxing的核心jar包

core-3.2.0.jar

可以百度搜索下载jar文件,也可使用maven添加依赖

        <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.2.0</version></dependency>

下面是将生成的二维码矩阵写入到jpg文件中。

     * 生成二维码图片* @param dir        存放的目录* @param fileName  文件名要以.jpg结尾* @param content  这个内容可以是文字或链接*/public static void generateQRCode(String dir, String fileName, String content) {//生成二维码的宽高int size = 400;Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();// 指定纠错等级
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定编码格式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 指定二维码的边距,设置后无效,,设置纠错等级ErrorCorrectionLevel.H为高等级时,无效        //hints.put(EncodeHintType.MARGIN, 1);
        try {//encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints)BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);//bitMatrix = updateBit(bitMatrix, 20);File file1 = new File(dir);if (!file1.exists()) {file1.mkdirs();}//将生成的矩阵像素写入到指定文件中,这里是以jpg结尾MatrixToImageWriter.writeToStream(bitMatrix, "jpg", new FileOutputStream(dir + "/" + fileName));System.out.println("创建成功");} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

上面指定了纠错等级设置有四个值

 /** L = ~7% correction */L(0x01),/** M = ~15% correction */M(0x00),/** Q = ~25% correction */Q(0x03),/** H = ~30% correction */H(0x02);

指定为L,M 这两个等级时,二维码大小会根据其存储的数据量变化,即边距肯能会很大,看下图,

Q,H高等级时,会按照标准格式显示二维码图片。建议使用H等级。

这里生成的二维码留的白色边距有点多,想要适当减小边距,看下图

如果不想边距太大,我们可以将生成的二维码图片进行剪切。新建立一个空的BitMatrix对象来放这个二维码

margin为白色边距的大小

private static BitMatrix updateBit(BitMatrix matrix, int margin) {int tempM = margin * 2;//left,top,width,height // 0    1    2     3   对应的数组下标//这里的width和height是指去除白色边框后的真实的二维码长宽,而不是图片长宽。int[] rec = matrix.getEnclosingRectangle(); // 获取二维码图案的属性int resWidth = rec[2] + tempM;//真实宽度加左右边距int resHeight = rec[3] + tempM;BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); // 按照自定义边框生成新的BitMatrix
resMatrix.clear();//从上->下按列进行值得复制,即一列一列的扫描到新的二维矩阵中for (int i = margin; i < resWidth - margin; i++) { // 循环,将二维码图案绘制到新的bitMatrix中for (int j = margin; j < resHeight - margin; j++) {//margin + rec[0]if (matrix.get(i - margin + rec[0], j - margin + rec[1])) {resMatrix.set(i, j);}}}return resMatrix;}

生成二维码

这样白色边距就不会太大了,好看多了

后面还有将二维码嵌入到海报,或者其他活动图片上的方法,直接上代码

将二维码放置在图片右下角的位置

public void insertQRCode(BufferedImage zxingImage, String backgroundPath) {InputStream dest = null;try {dest = new FileInputStream(backgroundPath);BufferedImage image = ImageIO.read(dest);Graphics g = image.getGraphics();int leftMargin = image.getWidth() - zxingImage.getWidth() - 10;int topMargin = image.getHeight() - zxingImage.getHeight() - 10;g.drawImage(zxingImage, leftMargin, topMargin, zxingImage.getWidth(), zxingImage.getHeight(), null);ImageIO.write(image, "jpg", new FileOutputStream("D:\\QRCode\\zengmei.jpg"));System.out.println("创建成功");} catch (IOException e) {e.printStackTrace();}}

生成后的结果,图片是本地随便找了一张图片

修改二维码线条颜色,在二维码中插入logo图标等方法

发现修改二维码颜色之后,用微信,qq扫描二维码很难被识别。这个很难受。这里说下怎么改。

修改原理就是,将内容通过new MultiFormatWriter().encode()方法生成二维矩阵后,,

用一个新的BufferedImage对象作为容器给矩阵的两个不同的值设置颜色,有值得为true,没值false,即设置黑白两种颜色

/*** * @param onColor 二维码的颜色,即黑白二维码的黑色 :0xFF000000  蓝色 0xFF000055* @param offColor 二维码的背景色   如白色:0xFFFFFFFF*/public static void generateOtherQRCode(int onColor, int offColor) {String content = "小姐姐最棒啦^_^";int size = 200;Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();// 指定纠错等级
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);// 指定编码格式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix,new MatrixToImageConfig(onColor, offColor));ImageIO.write(image, "png", new FileOutputStream("D:/QRCode/beautiful.png"));System.out.println("操作成功");} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}

重要方法是:MatrixToImageWriter.toBufferedImage也就是设置颜色,然后返回BufferImage对象
public static BufferedImage toBufferedImage(BitMatrix matrix, MatrixToImageConfig config) {int width = matrix.getWidth();int height = matrix.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, matrix.get(x, y) ? onColor : offColor);}}return image;}

//imageType , zxing支持的图像类型有三种,黑白颜色的默认为BufferedImage.TYPE_BYTE_BINARY = 12,图像不带透明度alpha   最多是4bit的的图像TYPE_INT_RGB  这个是不带alpha的8bit图像TYPE_INT_ARGB 这个带alpha的8bit图像
java.awt.image.BufferedImage.BufferedImage(int width, int height, int imageType)

谢谢浏览

参考链接:

关于JAVA实现二维码以及添加二维码LOGO

https://www.cnblogs.com/qwqwQAQ/p/8118109.html

JAVA实现基于ZXing的二维码自动生成与图片合成

https://blog.csdn.net/mruso/article/details/79744670

Java通过Zxing生成二维码

http://blog.51cto.com/9732420/1742136

开源项目地址

https://github.com/zxing/zxing

转载于:https://www.cnblogs.com/gne-hwz/p/9445466.html

java学习-zxing生成二维码矩阵的简单例子相关推荐

  1. java使用zxing生成二维码,可带logo和底部文字

    java使用zxing生成二维码,可带logo和底部文字 springboot中整合zxing生成二维码 一.导入依赖 <properties><zxing.version>3 ...

  2. java利用zxing生成二维码

    什么是ZXing? ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库. 利用ZXing这个工具库来生成二维码,具体操作如下: 引入相关资源包 <dependency&g ...

  3. Java利用Zxing生成二维码及解析二维码内容

    前言 Java 操作二维码的开源项目很多,如 SwetakeQRCode.BarCode4j.Zxing 等等 本篇文章是介绍利用Zxing来生成二维码图片在web网页上展示,同时解析二维码图片. Z ...

  4. java使用zxing生成二维码

    zxing是Google提供的免费开源且操作十分方便的一个针对二维码的项目 代码也比较简单,这里我就直接把注释写上,直接根据自己的需要改动就行了. maven依赖: <dependencies& ...

  5. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  6. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  7. 五十九、使用ZXing生成二维码

    @Author:Runsen @Date:2020/7/12 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  8. zxing 生成二维码,可设置logo、二维码颜色、白边大小

    主要是使用google的zxing 生成二维码,可设置logo.二维码前景色/后景色.白边大小.二维码大小 1.用到jar包 <dependency><groupId>com. ...

  9. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

最新文章

  1. SAMBA服务器应用
  2. 理解Netty中的零拷贝(Zero-Copy)机制
  3. 二维火:智能餐饮云端互联
  4. React之函数中的this指向
  5. 卡尔曼滤波,高斯函数
  6. python 下载百度文库_百度文库随便下载,解除限制
  7. Spring AOP之动态代理方式
  8. 01、3dB双分支定向耦合器
  9. 收费java代码_基于jsp的高速公路收费-JavaEE实现高速公路收费 - java项目源码
  10. 【音视频基础】(五):CIE颜色空间一之色调、明度和饱和度
  11. Android 上传代码到gitee并发布到Jitpack生成远程库
  12. 单片机英文缩写(单片机常用的英文缩写及英文全称)
  13. Web Scraping with Python 学习笔记8
  14. springboot如何打开jsp页面或者html页面
  15. 《大学 中庸中华经典藏书》读书笔记
  16. 调试器工作原理之三——调试信息
  17. javascript开发微信小程序,怎么通过手机查询车辆维修保养,车辆维修保养服务方案
  18. 直击环球资源电子展:把“巨幕影院”戴在眼前是什么体验
  19. 想要宫崎骏风格壁纸?安排
  20. 黄健翔质疑半自动越位技术?用「技术流」解读卡塔尔世界杯

热门文章

  1. Docker容器中文件与本地相互复制拷贝
  2. [BZOJ1117]救火站gas
  3. 142. 环形链表 II
  4. Android带平移动画的栏目选择功能
  5. java计算机毕业设计教学成果管理平台源程序+mysql+系统+lw文档+远程调试
  6. 乐学python_铁乐学python_shelve模块详解
  7. 如何取消拯救者切换大小写屏幕上的提示图案
  8. 线程池到底参数设置多少线程才合适?
  9. 迈思德网关成功与TLINK物联网平台对接
  10. 关于tcc、tlink的编译链接机制的研究