<!-- 二维码jar包google.zxing -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
</dependency>
/**
* 生成二维码
*/
public class QRCodeUtils {
private static final String CHARSET = "utf-8";
// 二维码尺寸
private static final int QRCODE_SIZE = 335;
// 用二维码生成新图片,新图片加高多少,比如加的字体大小为24,这里就设置成26
private static final int FONT_SIZE_HEIGHT = 26;
// 用二维码生成新图片,宽度
private static final int BUFFEREDIMAGE_SIZE_WIDTH = QRCODE_SIZE;
// 用二维码生成新图片,高度
private static final int BUFFEREDIMAGE_SIZE_HEIGHT = QRCODE_SIZE + FONT_SIZE_HEIGHT;
/**
* 二维码生成BASE64,返给前端
*
* @param code 二维码图值信息
* @return
* @throws Exception
*/
public static String getQRCode(String code) throws Exception {
String text = null;
ByteArrayOutputStream outputStream = null;
ByteArrayOutputStream outputStream2 = null;
try {
if (StringUtils.isEmpty(code)) {
throw new Exception("二维码值为空");
}
Hashtable<EncodeHintType, Object> hints = new Hashtable<>(16);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(code,
BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
outputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
//以下部分是给二维码加文字,不加可以不用写
//将b作为输入流;
ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());
//将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
BufferedImage image = ImageIO.read(in);
BufferedImage bufferedImage = addNote(image,new String(("NO. " + code).getBytes("UTF-8"),"UTF-8"));
outputStream2 = new ByteArrayOutputStream();
ImageIO.write(bufferedImage,"PNG",outputStream2);
//以上部分是给二维码加文字,不加可以不用写,不写时将outputStream2改成outputStream
Base64.Encoder encoder = Base64.getEncoder();
text = encoder.encodeToString(outputStream2.toByteArray());
} finally {
if (outputStream != null) {
outputStream.close();
}
if (outputStream2 != null) {
outputStream2.close();
}
}
return "data:image/png;base64," + text;
}
/**
* 给二维码下方添加说明文字
* @param image 原二维码
* @param note 说明文字
* @return 带说明文字的二维码
*/
public static BufferedImage addNote(BufferedImage image,String note){
Image src = image.getScaledInstance(QRCODE_SIZE, QRCODE_SIZE,Image.SCALE_DEFAULT);
BufferedImage tag;
if (note.length()<=24){
//生成新图片的大小
tag = new BufferedImage(BUFFEREDIMAGE_SIZE_WIDTH, BUFFEREDIMAGE_SIZE_HEIGHT,BufferedImage.TYPE_INT_RGB);
}else{
//这句代码还没调试过,这里表示文字需要折行
tag = new BufferedImage(300, 345,BufferedImage.TYPE_INT_RGB);
}
//设置低栏白边
Graphics g1 = tag.getGraphics();
//设置文字
Graphics2D g2 = tag.createGraphics();
Font font = new Font("微软雅黑",Font.BOLD,24);
g2.setFont(font);
g2.setColor(Color.BLACK);
if (note.length()<=24) {
//下面这个26要和tag = new BufferedImage(330, 356,BufferedImage.TYPE_INT_RGB);356-330=26对上
g1.fillRect(0, QRCODE_SIZE, QRCODE_SIZE, FONT_SIZE_HEIGHT);
//文字在图片上的位置
g2.drawString(note,/*QRCODE_SIZE/2-note.length()*8-14*/20, QRCODE_SIZE+font.getSize());
}else{
//这里的代码还没测试过
g1.fillRect(0, QRCODE_SIZE, QRCODE_SIZE, 45);
//下面两次表示文件需要换行显示
g2.drawString(note.substring(0, 24),5, QRCODE_SIZE+font.getSize());
g2.drawString(note.substring(24,note.length()), QRCODE_SIZE/2-(note.length()-24)*8-14, QRCODE_SIZE+font.getSize()*2+4);
}
g1.drawImage(src, 0, 0, null);
g1.dispose();
g2.dispose();
image = tag;
image.flush();
return image;
}
public static void main(String[] args) throws Exception {
//下面是生成文件
/* String text = "http://www.baidu.com"; //这里设置自定义网站url
String logoPath = "C:\\Users\\admin\\Desktop\\test\\test.jpg";
String destPath = "C:\\Users\\admin\\Desktop\\test\\";
System.out.println(QRCodeUtils.encode(text, logoPath, destPath, true));*/
//下面是生成base64
System.out.println(getQRCode("112233hhhh"));
/*File qrcFile = new File("E:/img/","tupian.png");
pressText("谷歌", qrcFile, 5, Color.RED, 32);*/
}
}