本次文章讲解如何通过java代码生成二维码,主要包括两个方面:1、将指定URL转成二维码 2、生成二维码中添加背景图片 生成二维码的功能主要是依赖Google的Zxing包。
1、添加google依赖包Zxing
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
2、将指定URl转成二维码图片,并设置二维码高、宽度
/**
* 生成二维码图片
*
* @param url
* @param path
* @param fileName
* @return
*/
public static String createQrCode(String url, String path, String fileName) {
try {
Map<EncodeHintType, String> hints = new HashMap<>(16);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 400, 400, hints);
File file = new File(path, fileName);
boolean iscreate = ((file.getParentFile().exists() || file.getParentFile().mkdirs()) && file.createNewFile());
if (file.exists() || iscreate) {
writeToFile(bitMatrix, "jpg", file);
return file.getPath();
}
} catch (Exception e) {
log.error("error", e);
}
return null;
}
运行结果如下:
上面代码为保存二维码图片的方式还可以在二维码图片上添加背景图片
/**
* 生成二维码图片+文字描述
* @param width
* @param height
* @param imagesX
* @param imagesY
* @param qrWidth
* @param qrHeight
* @param url
* @param path
* @param fileName
* @param title
* @param titleX
* @param titleY
* @param size
* @return
*/
public static File createQrCodeWithTitle(Integer width, Integer height, Integer imagesX, Integer imagesY, Integer qrWidth, Integer qrHeight, String url, String path, String fileName, String title, Integer titleX, Integer titleY,Integer size){
try {
Map<EncodeHintType, String> hints = new HashMap<>(16);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, qrWidth, qrHeight, hints);
BufferedImage image = new BufferedImage(qrWidth, qrHeight, BufferedImage.TYPE_INT_RGB);
/** 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF) 白(0xFF000000)两色**/
for (int x = 0; x < qrWidth; x++) {
for (int y = 0; y < qrHeight; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
}
}
BufferedImage backgroundImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
int bgWidth=backgroundImage.getWidth();
int qrwidth=image.getWidth();
//距离背景图片x边的距离,居中显示
int disx=(bgWidth-qrwidth)-imagesX;
//距离y边距离 * * * *
int disy=imagesY;
Graphics2D rng=backgroundImage.createGraphics();
rng.setBackground(Color.WHITE);
rng.setColor(new Color(255, 255, 255));
rng.fillRect(0, 0, width, height);
rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
rng.drawImage(image,disx,disy,qrWidth,qrHeight,null);
/** 文字描述参数设置 */
Color textColor=Color.white;
rng.setColor(textColor);
rng.drawImage(backgroundImage,0,0,null);
/**设置字体类型和大小(BOLD加粗/ PLAIN平常)*/
rng.setFont(new Font("WenQuanYi Micro Hei",Font.BOLD,size));
/**设置字体颜色*/
rng.setColor(Color.black);
int strWidth=rng.getFontMetrics().stringWidth(title);
/**文字1显示位置*/
/**左右*/
int disx1=(bgWidth-strWidth)-titleX;
/**上下*/
rng.drawString(title,disx1,titleY);
rng.dispose();
image=backgroundImage;
image.flush();
File file = new File(path, fileName);
boolean iscreate = ((file.getParentFile().exists() || file.getParentFile().mkdirs()) && file.createNewFile());
if (file.exists() || iscreate) {
ImageIO.write(image, "png", file);
return file;
}
} catch (Exception e) {
log.error("error", e);
}
return null;
}
运行结果如下:
在二维码上添加背景图片中文字体通过font操作的话,在linux上需要设置下字体,否则中文不识别。
yum -y install wqy-microhei-fonts wqy-zenhei-fonts
mkdir -p /opt/xxx/java/jre/lib/fonts/fallback
ln -s /usr/share/fonts /opt/xxx/java/jre/lib/fonts/fallback
完成源码详见:https://github.com/javazyw/demoProject.git
来源:oschina
链接:https://my.oschina.net/javazyw/blog/4920675