使用google的zxing生成二维码

.先下载zxing开发包,这里用到的只是core的jar包

注意:网上下载的core.jar使用JDK1.5;core2*.jar包使用JDK1.6;core3*.jar使用JDK1.7;

源码:

package com.common.redis;


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;


import javax.imageio.ImageIO;


import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;


import junit.framework.Assert;



public class TestQRCodes {


private static final boolean NEEDCOMPRESS = true;


private static String LOGO_URL;
// LOGO宽度
private static final int WIDTH = 60;
// LOGO高度
private static final int HEIGHT = 60;


static{
LOGO_URL = "D:\\Users\\ex-zouxi001\\Desktop\\2号.JPG";// 测试图片路径地址
}


/**
* 生成二维码的工具类

* @param data
*            二维码中携带的数据
* @param width
*            二维码的宽度
* @param height
*            二维码的高度
* @return 返回base64格式的图片(data:image/gif;base64,xxxx) <br>
*         eg: <code>
* &ltimg alt="" src="data:image/gif;base64,xxxx"&gt
* </code>
*/
public static String createQRCode(String data, int width, int height, String isPicture) {


Assert.assertTrue("param data cannot empty.", data != null && data.trim().length() > 0);


Assert.assertTrue("param width and height must gt 0.", width > 0 && height > 0);


ByteArrayOutputStream bos = null;


MultiFormatWriter formatWriter = new MultiFormatWriter();


Hashtable<EncodeHintType, Object> param = new Hashtable<EncodeHintType, Object>();
param.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
param.put(EncodeHintType.CHARACTER_SET, "utf-8");
param.put(EncodeHintType.MARGIN, 0);


try{
BitMatrix bitMatrix = formatWriter
.encode(data, BarcodeFormat.QR_CODE, width, height, param);
// 1.1去白边
int[] rec = bitMatrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++){
for (int j = 0; j < resHeight; j++){
if (bitMatrix.get(i + rec[0], j + rec[1])){
resMatrix.set(i, j);
}
}
}
int width1 = resMatrix.getWidth();
int height1 = resMatrix.getHeight();
BufferedImage qrcode = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width1; x++){
for (int y = 0; y < height1; y++){
qrcode.setRGB(x, y, resMatrix.get(x, y) == true ? Color.BLACK.getRGB() : Color.WHITE
.getRGB());
}
}
// 添加logo图片
if (StringUtils.isNotEmpty(LOGO_URL) && StringUtils.isNotEmpty(isPicture)){
insertImage(width1, qrcode, LOGO_URL, NEEDCOMPRESS);
}
bos = new ByteArrayOutputStream();
ImageIO.write(qrcode, "png", bos);


String img = StringUtils.deleteWhitespace(Base64.encodeBase64String(bos.toByteArray()));
return String.format("data:image/png;base64,%s", img);
} catch (Exception e){
throw new RuntimeException(e);
} finally{
if (bos != null){
try{
bos.close();
} catch (IOException e){
}
}
}


}


private static void insertImage(int QRCODE_SIZE, BufferedImage source, String imgPath,
boolean needCompress) throws Exception {
File file = new File(imgPath);
if (!file.exists()){
System.err.println("" + imgPath + "   该文件不存在!");
return;
}
Image src = ImageIO.read(new File(imgPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress){ // 压缩LOGO
if (width > WIDTH){
width = WIDTH;
}
if (height > HEIGHT){
height = HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graph.drawImage(src, x, y, width, height, null);
// Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
// graph.draw(shape); 去除图片白边
graph.dispose();
}


/**
* @param data
*            二维码携带的数据
* @param size
*            二维码的宽、高
* @return
* @see WechatValidateUtils#generateQRCode(String, int, int)
*/
public static String createQRCode(String data, int size, String isPicture) {
return createQRCode(data, size, size, isPicture);
}


// 测试
public static void main(String[] args) throws Exception {
// 生成二维码
String url = "http://www.baidu.com";
String src = createQRCode(url, 200, "1");
System.out.println(url.length());
String html = "<img src=\"" + src + "\">";
FileOutputStream ops = new FileOutputStream("D:\\ssss\\test.html");
org.apache.commons.io.IOUtils.write(html, ops, "utf-8");
ops.close();
}
}

使用Java生成二维码,你可以依赖Googlezxing类库。这个类库提供了二维码生成的策略,你只需要调用它的API来生成二维码对象。首先,你需要准备以下信息:字符串内容、二维码的宽度和高度、字符集、颜色、外边距和纠错等级等。在zxing包中的MultiFormatWriter类是生成二维码的核心工具类,你可以使用它的encode方法将要封装的字符串内容转化为二维码对象。 以下是生成二维码的步骤: 步骤1:导入zxing类库,并创建MultiFormatWriter对象。 步骤2:创建一个Map集合,用于存储参数,包括字符集和二维码类型。 步骤3:调用MultiFormatWriter对象的encode方法,传入字符串内容和参数Map,将其转化为二维码对象。 步骤4:将二维码对象写入磁盘或输出流,以保存或展示二维码。 下面是一个简单的Java代码示例,演示了如何使用zxing生成二维码: ``` import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { public static void main(String[] args) { String content = "Hello, World!"; // 二维码内容 int width = 300; // 二维码宽度 int height = 300; // 二维码高度 String charset = "UTF-8"; // 字符集 // 设置参数 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, charset); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 纠错等级为高 try { // 生成二维码 BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); // 创建BufferedImage对象,并设置颜色模式 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); image.createGraphics(); // 设置二维码颜色 Graphics2D graphics = (Graphics2D) image.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, width, height); graphics.setColor(Color.BLACK); // 绘制二维码 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (matrix.get(i, j)) { graphics.fillRect(i, j, 1, 1); } } } // 保存二维码到磁盘 ImageIO.write(image, "png", new File("qrcode.png")); System.out.println("二维码已生成并保存到qrcode.png文件中。"); } catch (Exception e) { e.printStackTrace(); } } } ``` 这段代码将生成一个内容为"Hello, World!"的二维码,并保存到名为qrcode.png的文件中。你可以根据自己的需求调整代码中的参数,来生成不同样式的二维码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java利用zxing生成二维码](https://blog.csdn.net/qq_43598138/article/details/105444641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java利用Zxing生成二维码的简单实例](https://download.csdn.net/download/weixin_38598703/12794633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值