Java通过Zxing生成二维码

今天,要完成一个批量生成二维码的工作,并将生成好的二维码与另外一张底图拼接,生成一张新图。

Java生成二维码主要的sdk为,qrcode和zxing,二者差别不大,这里采用了zxing。

首先,直接使用其core.jar,然后实现MatrixToImageWriter类。

在使用zxing时,我们发现默认生成的白边太大,想进行修改,通过updateBit方法进行指定白边的宽度。在修改完其白边后,会影响默认设置的二维码大小,通过zoomInImage方法进行修复。

在合成两张图片时,通过SmallBigImage类的overlapImage方法进行实现。

整个项目具体代码如下:

Main类:

packageerweima;

importjava.awt.Graphics;

importjava.awt.image.BufferedImage;

import java.io.File;

import java.util.*;

importjavax.imageio.ImageIO;

importcom.google.zxing.*;

importcom.google.zxing.common.BitMatrix;

publicclass Main {

static String bigPath="E:/erweiimg/background.jpg";

publicstaticvoid main(String[] args) {

try {

for (inti = 0; i < 100; i++) {

String content = "http://101.201.143.212/erweima/carTel.php?qrid="

+ i;

String path = "E:/erweiimg/";

intsize = 751; // 二维码图片大小

MultiFormatWriter multiFormatWriter = new MultiFormatWriter();

Map hints = new HashMap();

hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

// hints.put(EncodeHintType.MARGIN, 0);

BitMatrix bitMatrix = multiFormatWriter.encode(content,

BarcodeFormat.QR_CODE, size, size, hints);

// bitMatrix=deleteWhite(bitMatrix);

bitMatrix = updateBit(bitMatrix, 10);

File file1 = new File(path, "qrid_" + i + ".jpg");

File file2 = new File(path, "qrid__" + i + ".jpg");

File file3 = new File(path, "qrid___" + i + ".jpg");

MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);

BufferedImage bi = MatrixToImageWriter

.toBufferedImage(bitMatrix);

bi = zoomInImage(bi, size, size);// 根据size放大、缩小生成的二维码

BufferedImage big=ImageIO.read(new File(bigPath));

BufferedImage hebing=SmallBigImage.overlapImage(big,bi);;

//ImageIO.write(bi, "png",file2); // 生成二维码图片

ImageIO.write(hebing, "png", file3);

}

} catch (Exception e) {

e.printStackTrace();

}

}

publicstatic BitMatrix deleteWhite(BitMatrix matrix) {

int[] rec = matrix.getEnclosingRectangle();

intresWidth = rec[2] + 1;

intresHeight = rec[3] + 1;

BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);

resMatrix.clear();

for (inti = 0; i < resWidth; i++) {

for (intj = 0; j < resHeight; j++) {

if (matrix.get(i + rec[0], j + rec[1]))

resMatrix.set(i, j);

}

}

returnresMatrix;

}

privatestatic BitMatrix updateBit(BitMatrix matrix, intmargin) {

inttempM = margin * 2;

int[] rec = matrix.getEnclosingRectangle(); // 获取二维码图案的属性

intresWidth = rec[2] + tempM;

intresHeight = rec[3] + tempM;

BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); // 按照自定义边框生成新的BitMatrix

resMatrix.clear();

for (inti = margin; i < resWidth - margin; i++) { // 循环,将二维码图案绘制到新的bitMatrix中

for (intj = margin; j < resHeight - margin; j++) {

if (matrix.get(i - margin + rec[0], j - margin + rec[1])) {

resMatrix.set(i, j);

}

}

}

returnresMatrix;

}

publicstatic BufferedImagezoomInImage(BufferedImage originalImage,

intwidth, intheight) {

BufferedImage newImage = new BufferedImage(width, height,

originalImage.getType());

Graphics g = newImage.getGraphics();

g.drawImage(originalImage, 0,0, width, height, null);

g.dispose();

returnnewImage;

}

}

SmallBigImage类:

packageerweima;

importjava.awt.Graphics2D;

import java.awt.Image;

import java.awt.Toolkit;

importjava.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

publicfinalclass SmallBigImage {

publicstaticfinal BufferedImage overlapImage(BufferedImage big, BufferedImage small) {

try {

//      BufferedImage big = ImageIO.read(newFile(bigPath));

//      BufferedImage small = ImageIO.read(newFile(smallPath));

Graphics2D g = big.createGraphics();

intx = 197;

inty = 65;

g.drawImage(small, x, y, small.getWidth(), small.getHeight(), null);

g.dispose();

//      ImageIO.write(big, "jpg",new File("config/resource/BigSmall.jpg"));

returnbig;

} catch (Exception e) {

e.printStackTrace();

}

returnbig;

}

}

MatrixToImageWriter类:

packageerweima;

importcom.google.zxing.common.BitMatrix;

importjavax.imageio.ImageIO;

importjava.io.File;

importjava.io.OutputStream;

importjava.io.IOException;

importjava.awt.image.BufferedImage;

publicfinalclass MatrixToImageWriter {

privatestaticfinalintBLACK = 0xFF000000;

privatestaticfinalintWHITE = 0xFFFFFFFF;

private MatrixToImageWriter() {

}

publicstatic BufferedImagetoBufferedImage(BitMatrix matrix) {

intwidth = matrix.getWidth();

intheight = matrix.getHeight();

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

for (intx = 0; x < width; x++) {

for (inty = 0; y < height; y++) {

image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);

}

}

returnimage;

}

publicstaticvoid writeToFile(BitMatrix matrix, String format, File file)

throws IOException {

BufferedImage image = toBufferedImage(matrix);

if (!ImageIO.write(image, format, file)) {

thrownew IOException("Couldnot write an image of format "

+ format + " to " + file);

}

}

publicstaticvoid writeToStream(BitMatrix matrix, String format,

OutputStream stream) throws IOException {

BufferedImage image = toBufferedImage(matrix);

if (!ImageIO.write(image, format, stream)) {

thrownew IOException("Couldnot write an image of format "

+ format);

}

}

}

时间: 2024-10-13 18:24:21

Java通过Zxing生成二维码的相关文章

java学习-zxing生成二维码矩阵的简单例子

这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件 也可使用maven添加依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> </dependency> 最简单的生成二维码的方法,

Java利用Zxing生成二维码

Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法,现在我简单介绍一下使用Java利用Zxing生成与解析二维码 1.二维码的生成 1.1 将Zxing-core.jar 包加入到classpath下. 1.2 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用. import com.google.zxing.common.BitMatrix; i

java 通过zxing生成二维码

1.基本类提供二维码生成工具类 package com.green.util; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; import com.google.zxing.com

ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(goole)生的,QRCode就不用说了吧,虽说技术无国界,但是国人还是有点.... 好,言归正传,java用ZXi

Java根据链接生成二维码

Java根据链接生成二维码 相关 jar 包: core-3.1.0.jar 源码及 jar 包下载:http://files.cnblogs.com/files/liaolongjun/qrcode.zip 可直接运行: package llj.mf.utils; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; i

(转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(gool

使用QRCode和zXing生成二维码

首先将需要的jar加到工程中 QRCode.jar.zxingcore-2.2.jar.javase-2.2.jar(也可不加,增加一个MatrixToImageWriter类也可以) package com.demo; import com.google.zxing.common.BitMatrix; import javax.imageio.ImageIO; import java.io.File; import java.io.OutputStream; import java.io.IO

zxing生成二维码设置边框颜色

真是研究了很久很久,满满的泪啊 zxing生成二维码,默认是可以增加空白边框的,但是并没有说设置边框颜色的属性. 其中增加空白边框的属性的一句话是: Map hints = new HashMap();hints.put(EncodeHintType.MARGIN, 1); 使用这句话设置边框,留出来的边框的颜色,就是二维码中主颜色的以外的那个颜色.通常主颜色都是黑色,背景色都是白色.如下二维码的边框的颜色,就是除了绿色以外的那个颜色. 所以并没有设置边框颜色的属性,那该怎么办?比如:要求使用P

引用ZXing生成二维码

1.生成二维码 ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口. Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.本文引用zxing.dll,生成二维码. using com.google.zxing.qrcode; using com.google.zxing; using com.google.zxing.common; using ByteMatrix = com.google.zxing.common.Byte