使用google的zxing生成二维码

原创 2016年05月31日 15:38:31

二维码,又叫二维条码。

1.java这边的话生成二维码有很多开发的jar包如 zxing,qrcode ,下面是使用zxing的开发包来实现的。
ZXing项目是google code上面提供的一个关于条码编解码的开源项目。 
2.先下载zxing开发包,这里用到的只是core的jar包

我在项目中使用的core2.2.jar包。

下载地址:http://download.csdn.net/download/tvcctv27tv/6841023

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

3. 源代码

package com.test.qrcodes;

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 junit.framework.Assert;

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;


public class TestQRCodes {

	private static final boolean NEEDCOMPRESS = false;

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

	static{
		LOGO_URL = "";// 测试图片路径地址
	}

	/**
	 * 生成二维码的工具类
	 * 
	 * @param data
	 *            二维码中携带的数据
	 * @param width
	 *            二维码的宽度
	 * @param height
	 *            二维码的高度
	 * @return 返回base64格式的图片(data:image/gif;base64,xxxx) <br>
	 *         eg: <code>
	 * <img alt="" src="data:image/gif;base64,xxxx">
	 * </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.sina.com.cn";
		String src = createQRCode(url, 200, "1");
		System.out.println(url.length());
		String html = "<img src=\"" + src + "\">";
		FileOutputStream ops = new FileOutputStream("D:\\QRCodeImage\\test.html");
		org.apache.commons.io.IOUtils.write(html, ops, "utf-8");
		ops.close();
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

java使用Google.zxing编、解二维码,条形码

zxing是Google的一个专门用于编码
  • qq_19425831
  • qq_19425831
  • 2014年08月14日 11:00
  • 2581

Google开源项目ZXing(二维条码编解码)简单使用(Java版)

http://code.google.com/p/zxing/ ZXing (pronounced "zebra crossing") is an open-source, multi-form...
  • BenW1988
  • BenW1988
  • 2011年12月14日 10:30
  • 50716

使用Google的ZXing库实现编解码二维码

导入包 1.首先建立一个实现LuminanceSource的类 /** * @FileName: BufferedImageLuminanceSource.java * @Author * @D...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2016年07月02日 00:25
  • 1994

Java 利用google.zxing类生成的BitMatrix二维码添加logo图标

Java 利用google.zxing类生成的BitMatrix二维码添加logo图标
  • qq_18252605
  • qq_18252605
  • 2017年07月18日 09:28
  • 1295

google api 生成二维码

谷歌提供了一个生成二维码的接口,通过接口我们可以生成二维码,方便又快捷。 接口地址 http://chart.apis.google.com/chart?chs=宽高值x宽高值&cht=qr&chl...
  • u011453631
  • u011453631
  • 2016年02月23日 17:07
  • 2514

Google zxing实现二维码扫描完美解决方案

最近因项目需求,需要在App中集成二维码扫描的功能。网上找了很多资料,最后决定使用Google的zxing来实现。实现的过程遇到了很多的坑,也是因为这些坑在网上没有具体的解决方案,今天就把我的实现过程...
  • u013718120
  • u013718120
  • 2016年06月15日 16:51
  • 36323

利用google Zxing 二维码生成与解析

生成二维码的开源项目可谓是琳琅满目,SwetakeQRCode、BarCode4j、Zxing...... 选择Zxing的原因可能是对 Google 公司的信赖和个人崇拜吧。 其实使用起来...
  • shenfuli
  • shenfuli
  • 2017年03月31日 11:43
  • 1719

Zxing和QR CODE 生成与解析二维码实例(带logo篇)

Zxing是Google提供的关于条码(一维码、二维码)的解析工具,利用Zxing和DENSO的QR CODE生成带logo的二维码的实例...
  • gao36951
  • gao36951
  • 2014年11月15日 19:49
  • 30274

谷歌zxing实现二维码生成和解析_http://kesun-shy.iteye.com/blog/2154169

zxing实现二维码生成和解析 博客分类: 二维码 zxing   二维码的生成与解析。有多种途径。我选择用大品牌,google老大的zxing。 gitHub链接是(我用的3.0.0,已经...
  • a363722188
  • a363722188
  • 2016年06月21日 09:13
  • 2256

java生成二维码的代码(使用谷歌zxing)

import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.aw...
  • xfl4629712
  • xfl4629712
  • 2017年02月14日 10:18
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用google的zxing生成二维码
举报原因:
原因补充:

(最多只允许输入30个字)