首先 在maven pom.xml 中加入
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.3.0</version>
</dependency>
然后创建生成二维码方法类
package com.beiquan.tts.utils;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Created by zhaoxiao on 2017/4/26.
*/
public class CreateParseCode {
/**
* 二维码的生成
*
* @param text
* @param width
* @param height
*/
public BufferedImage createCode(String text, int width, int height) {
HashMap hints = new HashMap();
// 内容所使用编码
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(text,
BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage img = MatrixToImageWriter.toBufferedImage(bitMatrix);
return img;
// 生成二维码
//File outputFile = new File(realPath
// + File.separator + text + '.' + imgFormat);
//MatrixToImageWriter.writeToFile(bitMatrix, imgFormat, outputFile);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void createCode() {
String text = "http://www.sougou.com";
int width = 300;
int height = 300;
// 二维码的图片格式
String format = "png";
/**
* 设置二维码的参数
*/
HashMap hints = new HashMap();
// 内容所使用编码
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(text,
BarcodeFormat.QR_CODE, width, height, hints);
// 生成二维码
File outputFile = new File("G:/二维码生成" + File.separator + "二维码生成"
+ File.separator + "TDC-test.png");
MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 二维码的解析
*
* @param file
*/
public void parseCode(File file) {
try {
MultiFormatReader formatReader = new MultiFormatReader();
if (!file.exists()) {
return;
}
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
Result result = formatReader.decode(binaryBitmap, hints);
System.out.println("解析结果 = " + result.toString());
System.out.println("二维码格式类型 = " + result.getBarcodeFormat());
System.out.println("二维码文本内容 = " + result.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
}
操作图片的类
package com.beiquan.tts.utils;
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
public final class MatrixToImageWriter {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private MatrixToImageWriter() {
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static BufferedImage writeToStream(BitMatrix matrix, String format, OutputStream stream)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
return image;
}
}
创建文件 文件夹的类(可选,如果在服务器中生成图片想存入磁盘中)
package com.beiquan.tts.utils;
import java.io.File;
import java.io.IOException;
public class CreateFileUtil {
public static boolean createFile(String destFileName) {
File file = new File(destFileName);
if (file.exists()) {
System.out.println("创建单个文件" + destFileName + "失败,目标文件已存在!");
return false;
}
if (destFileName.endsWith(File.separator)) {
System.out.println("创建单个文件" + destFileName + "失败,目标文件不能为目录!");
return false;
}
// 判断目标文件所在的目录是否存在
if (!file.getParentFile().exists()) {
// 如果目标文件所在的目录不存在,则创建父目录
System.out.println("目标文件所在目录不存在,准备创建它!");
if (!file.getParentFile().mkdirs()) {
System.out.println("创建目标文件所在目录失败!");
return false;
}
}
// 创建目标文件
try {
if (file.createNewFile()) {
System.out.println("创建单个文件" + destFileName + "成功!");
return true;
} else {
System.out.println("创建单个文件" + destFileName + "失败!");
return false;
}
} catch (IOException e) {
e.printStackTrace();
System.out
.println("创建单个文件" + destFileName + "失败!" + e.getMessage());
return false;
}
}
public static boolean createDir(String destDirName) {
File dir = new File(destDirName);
if (dir.exists()) {
System.out.println("创建目录" + destDirName + "失败,目标目录已经存在");
return false;
}
if (!destDirName.endsWith(File.separator)) {
destDirName = destDirName + File.separator;
}
// 创建目录
if (dir.mkdirs()) {
System.out.println("创建目录" + destDirName + "成功!");
return true;
} else {
System.out.println("创建目录" + destDirName + "失败!");
return false;
}
}
public static String createTempFile(String prefix, String suffix,
String dirName) {
File tempFile = null;
if (dirName == null) {
try {
// 在默认文件夹下创建临时文件
tempFile = File.createTempFile(prefix, suffix);
// 返回临时文件的路径
return tempFile.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
System.out.println("创建临时文件失败!" + e.getMessage());
return null;
}
} else {
File dir = new File(dirName);
// 如果临时文件所在目录不存在,首先创建
if (!dir.exists()) {
if (!CreateFileUtil.createDir(dirName)) {
System.out.println("创建临时文件失败,不能创建临时文件所在的目录!");
return null;
}
}
try {
// 在指定目录下创建临时文件
tempFile = File.createTempFile(prefix, suffix, dir);
return tempFile.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
System.out.println("创建临时文件失败!" + e.getMessage());
return null;
}
}
}
public static void main(String[] args) {
// 创建目录
String dirName = "D:/work/temp/temp0/temp1";
CreateFileUtil.createDir(dirName);
// 创建文件
String fileName = dirName + "/temp2/tempFile.txt";
CreateFileUtil.createFile(fileName);
// 创建临时文件
String prefix = "temp";
String suffix = ".txt";
for (int i = 0; i < 10; i++) {
System.out.println("创建了临时文件:"
+ CreateFileUtil.createTempFile(prefix, suffix, dirName));
}
// 在默认目录下创建临时文件
for (int i = 0; i < 10; i++) {
System.out.println("在默认目录下创建了临时文件:"
+ CreateFileUtil.createTempFile(prefix, suffix, null));
}
}
}
web程序中调用,首先在内存中生成图片,然后通过HttpServletResponse和 ImageIO 显示到页面上
具体做法
CreateParseCode cpCode = new CreateParseCode();
// 生成二维码
BufferedImage img = cpCode.createCode("http://www.baidu.com", 300, 300);
//不要缓存
//response.setDateHeader("expires", -1);
//告诉所有浏览器不要缓存
response.setHeader("Cache-control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("content-type", "image/png");
return ImageIO.write(img, "png", response.getOutputStream());
亲测,可用。