package com.dy.common.util;
|
|
import com.google.zxing.BarcodeFormat;
|
import com.google.zxing.EncodeHintType;
|
import com.google.zxing.WriterException;
|
import com.google.zxing.client.j2se.MatrixToImageWriter;
|
import com.google.zxing.common.BitMatrix;
|
import com.google.zxing.qrcode.QRCodeWriter;
|
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
|
import javax.imageio.ImageIO;
|
import java.awt.*;
|
import java.awt.image.BufferedImage;
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
public class QrCodeTest1 {
|
|
public static void main(String[] args) throws Exception {
|
|
String[] text = {"12345678;超声波水表;民旺道10号;大禹研究院;020-12345678;106.872615383,11.466578703"};
|
|
String imgpath = "D:\\demo\\";
|
|
for (int i = 0; i < text.length; i++) {
|
|
String[] s = text[i].split(";");
|
|
String[] lines = {"设备编号:" + s[0], "设备类型:" + s[1], "道路名称:" + s[2], "管护单位:" + s[3], "报修电话:" + s[4]};
|
String[] line = {s[0], s[1], s[2], s[3], s[4]};
|
|
createq(lines, line, imgpath + "test.jpeg");
|
}
|
}
|
|
static void createq(String[] lines, String[] line, String imgpath) {
|
|
String qrCodeText = line[0];
|
|
//二维码大小
|
int size = 400;
|
|
//画布大小
|
int combinedWidth = size + 800;
|
int combinedHeight = size + 400 ;
|
|
//标题高度
|
int topsize = 160;
|
|
//设置标题y坐标
|
int yTitle = 110;
|
|
//设置画布内边距
|
int padding = 5;
|
|
//设置标题内容
|
String title = "大禹集团";
|
|
//设置图片dpi
|
int dpi = 300;
|
|
Color blue = new Color(75, 125, 178);
|
|
//设置二维码参数
|
Map hints = new HashMap();
|
|
//设置UTF-8, 防止中文乱码
|
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
|
|
// 设置二维码的容错性
|
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
|
|
//留白 默认4
|
hints.put(EncodeHintType.MARGIN, 1);
|
|
// 码版本,取值为 1 到 40 ,根据二维码内容决定最低版本
|
hints.put(EncodeHintType.QR_VERSION, 3);
|
|
//创建码位图
|
BitMatrix bitMatrix = null;
|
try {
|
bitMatrix = new QRCodeWriter().encode(qrCodeText, BarcodeFormat.QR_CODE, size, size, hints);
|
} catch (WriterException e) {
|
e.printStackTrace();
|
}
|
|
//将生成码位图转换成BufferedImage
|
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
|
|
//创建空白BufferedImage
|
BufferedImage combined = new BufferedImage(combinedWidth, combinedHeight, BufferedImage.TYPE_INT_RGB);
|
|
//从BufferedImage对象中获取画布(Graphics2D)对象
|
Graphics2D graphics = combined.createGraphics();
|
|
//设置渲染提示为启用文本抗锯齿
|
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
//默认开启绘图抗锯齿
|
//graphics.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);
|
|
//设置空白画布整体背景颜色
|
GraphicsUtils.drawBackground(graphics,0, 0, combinedWidth, combinedHeight,Color.WHITE);
|
|
//绘制表格画线
|
//绘制线在内边距内,不影响其它内容,-1操作
|
int linepadding = padding - 1 ;
|
//绘制矩形
|
GraphicsUtils.drawRectangle(graphics,linepadding,linepadding,combinedWidth-linepadding*2,combinedHeight-linepadding*2,Color.BLACK);
|
//绘制内三横线
|
GraphicsUtils.drawLine(graphics,linepadding,padding+topsize+1,combinedWidth-linepadding,padding+topsize+1,Color.BLACK);
|
GraphicsUtils.drawLine(graphics,linepadding,padding+topsize+size+2,combinedWidth-linepadding,padding+topsize+size+2,Color.BLACK);
|
GraphicsUtils.drawLine(graphics,linepadding,combinedHeight-(combinedHeight-padding*2-topsize-size+2)/2 - padding,combinedWidth-linepadding,combinedHeight-(combinedHeight-padding*2-topsize-size+2)/2 - padding,Color.BLACK);
|
//绘制二维码竖线及右边2横线
|
GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1,padding+size+1,padding+topsize+size+1,Color.BLACK);
|
GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1+size/3,combinedWidth-linepadding,padding+topsize+1+size/3,Color.BLACK);
|
GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1+size/3*2,combinedWidth-linepadding,padding+topsize+1+size/3*2,Color.BLACK);
|
|
//该方法用于绘制头部绘制矩形并填充指定颜色
|
GraphicsUtils.drawFillRect(graphics,padding, padding, combinedWidth-(padding*2), topsize,blue);
|
|
//二维码插入画布
|
GraphicsUtils.drawImage(graphics,qrImage, padding, topsize+padding+2);
|
|
//该方法用于绘制头部绘制矩形并填充指定颜色
|
GraphicsUtils.drawBackground(graphics,padding, padding, combinedWidth-(padding*2), topsize,blue);
|
|
//绘制头部字体
|
Font titleFont = new Font("宋体", Font.BOLD, 70);
|
GraphicsUtils.drawFont(graphics,titleFont,Color.white);
|
FontMetrics fontMetrics = graphics.getFontMetrics();
|
int fontWidth = fontMetrics.stringWidth(title);
|
int xTitle = ((combinedWidth - fontWidth) / 2);
|
GraphicsUtils.drawText(graphics,title,xTitle, yTitle+padding,titleFont,Color.white);
|
|
//绘制非头部字体
|
|
//设置字体及颜色
|
Font downFont = new Font("宋体", Font.BOLD, 50);
|
GraphicsUtils.drawFont(graphics,downFont,Color.BLACK);
|
|
fontMetrics = graphics.getFontMetrics();
|
|
int fontHeight = fontMetrics.getHeight();
|
|
for (int i = 0; i < lines.length; i++) {
|
|
if (i < 3){
|
graphics.drawString(lines[i], size+padding+5, topsize+padding+ (size/3) * i + (size/3+fontHeight)/2 );
|
}else if (i == 3){
|
int test = combinedHeight-(combinedHeight-padding*2-topsize-size)/4*3 - padding + fontHeight/2 ;
|
graphics.drawString(lines[i], 5+padding, test);
|
}
|
else if (i == 4){
|
int test = combinedHeight-(combinedHeight-padding*2-topsize-size)/4 - padding + fontHeight/2 ;
|
graphics.drawString(lines[i], 5+padding, test);
|
}
|
}
|
|
graphics.dispose();
|
|
try {
|
ImageIO.write(combined, "jpeg",new File(imgpath) );
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
|
}
|
|
}
|