使用 Qrcode 生成中间带 logo 的二维码!
Posted xuehuashanghe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Qrcode 生成中间带 logo 的二维码!相关的知识,希望对你有一定的参考价值。
可以自由定义生成的二维码中间是否带 logo !
package com.controller; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.imageio.ImageIO; import com.entity.CodeImage; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.exception.DecodingFailedException; /** * @author Mongo */ public class QrCode { /** * 生成二维码(QRCode)图片 * * @param flag (是否带中间logo) */ public static void createQRCode(Boolean flag) { try { //================基本信息============================================== /* 要合成的两张图片 */ String logoPath = "D:/logo.png";//中间logo图片 String qrcodePath = "D:/qrcode.png";//二维码图片 /* 二维码种要存储的信息!(没有的话,二维码不展示!) */ String content = "您的设备已经中毒了,请注意!请注意!"; /* 合成的二维码的一些特性 */ String format = "png";//图片的格式 char correct = ‘H‘;// 容错率 char mode = ‘B‘;// 类型 int version = 10;// 版本(亦能决定合成后的二维码大小) /* 合成后的二维码的宽与高 */ int width = 178; int height = 178; //===================================================================== Qrcode qrcodeHandler = new Qrcode(); /* 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 */ qrcodeHandler.setQrcodeErrorCorrect(correct);// 特别注意:这里使用单引号!! 属于 char 类型,不是 String 类型 /* N代表数字,A代表字符a-Z,B代表其他字符 */ qrcodeHandler.setQrcodeEncodeMode(mode); /* 设置设置二维码版本,取值范围1-40,值越大尺寸越大,可存储的信息越大 */ qrcodeHandler.setQrcodeVersion(version); /* 内容 byte 化 */ byte[] contentBytes = content.getBytes("UTF-8"); BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); gs.setBackground(Color.WHITE); gs.clearRect(0, 0, width, height);//没有这个,二维码全黑 /* 设置图像颜色 */ gs.setColor(Color.BLACK); /* 设置偏移量 不设置可能导致解析出错 */ int pixoff = 2;//中间logo偏移大小 /* 输出内容 > 二维码 */ if (contentBytes.length > 0 && contentBytes.length < width) { boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } else { System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,200]. "); } /* 判断是否需要添加logo图片 */ if (flag) { int width_4 = width / 4; int width_8 = width_4 / 2; int height_4 = height / 4; int height_8 = height_4 / 2; Image img = ImageIO.read(new File(logoPath)); gs.drawImage(img, width_4 + width_8, height_4 + height_8, width_4, height_4, null); gs.dispose(); bufImg.flush(); } /* 生成二维码QRCode图片 */ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String fileName = sdf.format(new Date()) + "." + format; String url = qrcodePath + fileName; File imgFile = new File(url); if (!imgFile.exists()) { imgFile.mkdirs(); } ImageIO.write(bufImg, format, imgFile); System.out.println("生成二维码图片成功!"); } catch (Exception e) { e.printStackTrace(); } } /** * 解析二维码(直接读取二维码信息) */ public static String decode(String imagePath) { // QRCode 二维码图片的文件 File imageFile = new File(imagePath); BufferedImage bufImg = null; String content = null; try { bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); content = new String(decoder.decode(new CodeImage(bufImg)), "utf-8"); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } catch (DecodingFailedException dfe) { System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace(); } return content; } public static void main(String[] args) { Boolean flag = true;//是否添加中间logo! QrCode.createQRCode(flag); // String content = QrCode.decode("D:/xxxx.png");//解析二维码图片 // System.out.println("结束="+content); } }
解析二维码则需要一个实体类:
package com.entity; import java.awt.image.BufferedImage; import jp.sourceforge.qrcode.data.QRCodeImage; /** * @author Mongo */ public class CodeImage implements QRCodeImage { private BufferedImage bufferedImage; public CodeImage(BufferedImage image){ this.bufferedImage = image; } @Override public int getHeight() { return bufferedImage.getHeight(); } @Override public int getPixel(int x, int y) { return bufferedImage.getRGB(x, y); } @Override public int getWidth() { return bufferedImage.getHeight(); } }
需要的 jar 包:
Qrcode-C.jar
qrcode-R.jar
以上是关于使用 Qrcode 生成中间带 logo 的二维码!的主要内容,如果未能解决你的问题,请参考以下文章
为啥我用phprqcode 生成二维码带logo的时候,就无法读取信息
使用jquery.qrcode.min.js实现前台二维码生成(带Logo)
phpqrcode 分别生成普通带logo带背景带logo二维码