标签:输出内容 encode flag har 输出 write length java.awt version
可以自由定义生成的二维码中间是否带 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
标签:输出内容 encode flag har 输出 write length java.awt version
原文地址:https://www.cnblogs.com/xuehuashanghe/p/10304021.html