Maven依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
生成二维码
生成带颜色的二维码
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
public class DemoTest {
public static void main(String[] args) throws Exception {
// 二维码原理(将字符串信息通过一规则转换为图像)
// 生成二维码
String name = "d:/my.png";
String content = "www.baidu.com";
int width = 400;
int height = 400;
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.MARGIN, 2);
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bm = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
MatrixToImageWriter.writeToStream(bm, "png", new FileOutputStream(name));
// 上面生成普通二维码,下面生成带颜色二维码------------------------------------------------------------
BufferedImage bar = ImageIO.read(new File(name));
BufferedImage ok = new BufferedImage(width, height, 1);
ok.getGraphics().drawImage(bar, 0, 0, width, height, null);
Random rand = new Random();
Color c = new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
ok.setRGB(x, y, bar.getRGB(x, y) == -1 ? 0xffffffff : c.getRGB());
}
}
ImageIO.write(ok, "png", new File("d:/mymy.png"));
}
}
运行截图:
解析二维码
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
public class DemoTest {
public static void main(String[] args) throws Exception {
// 解析读取二维码
// 解析图像
BufferedImage i = ImageIO.read(new File("d:/my.png"));
LuminanceSource source = new BufferedImageLuminanceSource(i);
BinaryBitmap image = new BinaryBitmap(new HybridBinarizer(source));
try {
Result result = new MultiFormatReader().decode(image);
String info = result.getText();
System.out.println(info);
if (info == null || "".equals(info)) {
System.out.println("没有二维码信息");
} else if (info.contains("weixin")) {
System.out.println("有微信二维码,不允许");
} else {
System.out.println("有二维,可以使用");
}
} catch (Exception e) {
System.out.println("图像中没有二维码");
}
}
}
运行截图
生成条形码
生成带数字的条形码(可调色)
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.awt.Color;
import java.awt.Font;
import java.awt.RenderingHints;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
public class DemoTest3 {
public static void main(String[] args) throws Exception {
// 生成产品条码效果
String name = "d:/bar.png";
String content = "6923790798701";
int width = 300;
int height = 100;
BitMatrix bm = new MultiFormatWriter().encode(content, BarcodeFormat.EAN_13, width, height);
MatrixToImageWriter.writeToStream(bm, "png", new FileOutputStream(name));
// 以上代码只生成条形码,下面代码生成带数字条形码(可调整颜色)(带数字的条形码是在条形码的基础上进行生成的)
BufferedImage bar2 = ImageIO.read(new File(name));
BufferedImage bar = new BufferedImage(bar2.getWidth(), bar2.getHeight() + 30, 1);
Graphics2D g = bar.createGraphics();
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
g.setColor(Color.WHITE);
g.fillRect(0, 0, bar2.getWidth(), bar2.getHeight() + 30);
g.drawImage(bar2, 0, 15, bar2.getWidth(), bar2.getHeight(), null);
g.fillRect(62, 100, 85, 15);
g.fillRect(155, 100, 83, 15);
g.setColor(Color.BLACK);
g.setFont(new Font("", Font.PLAIN, 22));
g.drawString(content.substring(0, 1), 40, 120);
g.drawString(content.substring(1, 7), 68, 120);
g.drawString(content.substring(7), 158, 120);
g.dispose();
ImageIO.write(bar, "png", new File("d:/bar2.png"));
}
}
运行截图: