`

java利用zxing编码解码一维码与二维码

阅读更多
  最近琢磨了一下二维码、一维码的编码、解码方法,感觉google的zxing用起来还是比较方便。
  本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/2071020

一、工具类
package com.exam.services.qrcode;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

import javax.imageio.ImageIO;

import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.awt.image.BufferedImage;

/**
 * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。
 * 
 * <br/>
 * <br/>
 * 作者:wallimn<br/>
 * 联系:54871876@qq.com,http://wallimn.iteye.com<br/>
 * 时间:2014年5月25日  下午10:33:05<br/>
 */
public final class MatrixUtil {

	private static final String CHARSET = "utf-8";
	private static final int BLACK = 0xFF000000;
	private static final int WHITE = 0xFFFFFFFF;

	/**
	 * 禁止生成实例,生成实例也没有意义。
	 */
	private MatrixUtil() {
	}

	/**
	 * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。
	 * 
	 * <br/>
	 * <br/>
	 * 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:41:12<br/>
	 * 联系:54871876@qq.com<br/>
	 * 
	 * @param text
	 * @return
	 */
	public static BitMatrix toQRCodeMatrix(String text, Integer width,
			Integer height) {
		if (width == null || width < 300) {
			width = 300;
		}

		if (height == null || height < 300) {
			height = 300;
		}
		// 二维码的图片格式
		Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
		// 内容所使用编码
		hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
		BitMatrix bitMatrix = null;
		try {
			bitMatrix = new MultiFormatWriter().encode(text,
					BarcodeFormat.QR_CODE, width, height, hints);
		} catch (WriterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 生成二维码
		// File outputFile = new File("d:"+File.separator+"new.gif");
		// MatrixUtil.writeToFile(bitMatrix, format, outputFile);
		return bitMatrix;
	}

	/**
	 * 将指定的字符串生成二维码图片。简单的使用示例。
	 * 
	 * <br/>
	 * <br/>
	 * 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:44:52<br/>
	 * 联系:54871876@qq.com<br/>
	 * 
	 * @param text
	 * @param file
	 * @param format
	 * @return
	 */
	public boolean toQrcodeFile(String text, File file, String format) {
		BitMatrix matrix = toQRCodeMatrix(text, null, null);
		if (matrix != null) {
			try {
				writeToFile(matrix, format, file);
				return true;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return false;
	}

	/**
	 * 根据点矩阵生成黑白图。 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:26:22<br/>
	 * 联系:54871876@qq.com<br/>
	 */
	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;
	}

	/**
	 * 将字符串编成一维条码的矩阵
	 * 
	 * <br/>
	 * <br/>
	 * 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:56:34<br/>
	 * 联系:54871876@qq.com<br/>
	 * 
	 * @param str
	 * @param width
	 * @param height
	 * @return
	 */
	public static BitMatrix toBarCodeMatrix(String str, Integer width,
			Integer height) {

		if (width == null || width < 200) {
			width = 200;
		}

		if (height == null || height < 50) {
			height = 50;
		}

		try {
			// 文字编码
			Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
			hints.put(EncodeHintType.CHARACTER_SET, CHARSET);

			BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
					BarcodeFormat.CODE_128, width, height, hints);

			return bitMatrix;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根据矩阵、图片格式,生成文件。 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:26:43<br/>
	 * 联系:54871876@qq.com<br/>
	 */
	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);
		}
	}

	/**
	 * 将矩阵写入到输出流中。 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午10:27:58<br/>
	 * 联系:54871876@qq.com<br/>
	 */
	public static void 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);
		}
	}

	/**
	 * 解码,需要javase包。
	 * 
	 * <br/>
	 * <br/>
	 * 作者:wallimn<br/>
	 * 时间:2014年5月25日  下午11:06:07<br/>
	 * 联系:54871876@qq.com<br/>
	 * 
	 * @param file
	 * @return
	 */
	public static String decode(File file) {

		BufferedImage image;
		try {
			if (file == null || file.exists() == false) {
				throw new Exception(" File not found:" + file.getPath());
			}

			image = ImageIO.read(file);

			LuminanceSource source = new BufferedImageLuminanceSource(image);
			BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

			Result result;

			// 解码设置编码方式为:utf-8,
			Hashtable hints = new Hashtable();
			hints.put(DecodeHintType.CHARACTER_SET, CHARSET);

			result = new MultiFormatReader().decode(bitmap, hints);

			return result.getText();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
}


二、使用示例
package com.exam.services.qrcode;


import java.io.File;
  
public class Test {  
  
    /**
     * 测试函数。简单地将指定的字符串生成二维码图片。  
     * 
     * <br/><br/>
     * 作者:wallimn<br/>
     * 时间:2014年5月25日  下午10:30:00<br/>
     * 联系:54871876@qq.com<br/>
     */
    public static void main(String[] args) throws Exception {  
        String text = "http://wallimn.itey.com";  
        String result;
        String format = "gif";  
        //生成二维码  
        File outputFile = new File("d:"+File.separator+"rqcode.gif");  
        MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile);  
        result = MatrixUtil.decode(outputFile);
        System.out.println(result);
        
        outputFile = new File("d:"+File.separator+"barcode.gif");  
        MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile);
  
        result = MatrixUtil.decode(outputFile);
        System.out.println(result);
    }  
  
}  
分享到:
评论
1 楼 jinshitou2012 2014-10-30  

我也觉得zxing用起来方便!

相关推荐

    google zxing读取、生成一维码、二维码图片

    ZXing(Zebra Crossing)是Google开发的一个开源项目,专门用于处理一维条形码和二维二维码的生成与读取。这个项目的名字来源于其英文名的首字母缩写,象征着“斑马线”,寓意在数据世界中指引信息的交汇。ZXing提供...

    ireport生成一维码和google zxing二维码

    通过以上步骤,我们可以利用iReport结合ZXing库来生成具有一维码和二维码的报表,从而增强报表的信息承载能力和交互性。在实际应用中,这种功能可以广泛应用于产品标签、门票、营销推广等领域,为用户提供便捷的数据...

    基于zxing一维码二维码解析

    本项目专注于利用ZXing进行一维码和二维码的解析,将扫描到的编码内容转化为易于理解的字符串形式。 ### 1. ZXing简介 ZXing,寓意“斑马线”,是由Google开发的一个跨平台的条码处理库。它支持多种条码格式,包括...

    一维码二维码生成Zxing

    在IT行业中,一维码和二维码是数据编码的两种常见形式,广泛应用于商品标识、物流追踪、信息存储等领域。...在各种场景下,开发者都可以利用Zxing来实现与一维码和二维码相关的功能,提升应用的用户体验。

    一维码/二维码扫描

    ZXing(Zebra Crossing)是Google开发的一个强大的开源Java类库,它支持多种一维码和二维码的解码与编码,为开发者提供了一个便捷的工具来集成条形码扫描功能到他们的应用中,特别是在Android平台上。 一维码,全称...

    java生成一维码和二维码程序以及jar包

    在Java编程环境中,生成一维码和二维码是一项常见的任务,特别是在数据交换、追踪与追溯、信息展示等场景中。本文将深入探讨如何使用Java来创建一维码(如条形码)和二维码,并介绍相关jar包的使用方法。 首先,...

    ZXing-2.3.0 一维码 二维码源代码

    ZXing(Zebra Crossing)是Google开发的一个开源项目,用于读取、生成各种一维条形码和二维二维码。ZXing-2.3.0版本是这个库的一个里程碑,提供了丰富的功能和优化,使得开发者可以方便地在Android、iOS以及其他平台...

    Java二维码添加中间logo,有Zxing与QRCode两种方式

    关于Zxing和QRCode的比较,Zxing功能更全面,支持多种编码解码格式,而QRCode则专精于二维码生成,API设计更加简洁。在选择使用哪个库时,需要根据项目需求和性能考虑。 总的来说,生成带有中间logo的Java二维码...

    利用zxing制作解码二维码

    ZXing(Zebra Crossing)是Google开发的一个开源项目,专门用于处理一维条形码和二维条码,包括二维码。本教程将详细介绍如何利用ZXing库创建一个简单的二维码解码和生成应用。 首先,我们需要了解ZXing库的核心...

    android生成一维码与二维码

    生成二维码的过程与一维码类似,只是更换了`BarcodeFormat`: ```java BarcodeFormat format = BarcodeFormat.QR_CODE; String content = "https://example.com"; Bitmap bitmap = encoder.encodeBitmap(content, ...

    一维码二维码所需资源包javase-3.2.1 zxing-core-3.2.1.jar

    这两个资源包,`javase-3.2.1.jar` 和 `zxing-core-3.2.1.jar`,是开发Java应用程序时用于生成和解析一维码与二维码的关键组件。 `javase-3.2.1.jar` 是一个针对Java Standard Edition(Java SE)平台的特定版本库...

    java zxing二维码、条形码生成与解码

    Java ZXing库,全称“Zebra Crossing”,是一款开源的二维码和条形码处理库,广泛应用于各种数据编码和解码场景。它提供了强大的功能,能够轻松地在Java应用程序中生成和读取二维码和条形码。下面我们将深入探讨如何...

    Google ZXing制作的条形码、二维码的生成、扫描Demo 源码.zip

    总之,Google ZXing提供的源码Demo是一个宝贵的教育资源,可以帮助开发者深入了解条形码和二维码的生成与扫描原理,以及如何在实际项目中高效地利用ZXing库。通过深入研究这个源码,你不仅可以掌握ZXing的基本用法,...

    java 生成二维码 ZXing

    Java 生成二维码是一种常见的数据编码需求,ZXing(Zebra Crossing)是一个开源的、多格式的一维/二维条码图像处理库,它支持多种条码和二维码的生成与解码。在Java中利用ZXing库生成二维码,可以方便地将文本、链接...

    java解析生成一维码二维码源码加相关的jar包

    在提供的资源中,“java解析生成一维码二维码源码加相关的jar包”是一个解决方案,它基于ZXing(Zebra Crossing)库。ZXing是一个开源的、多平台的条形码和二维码读取、生成项目,它提供了多种编程语言的支持,包括...

    android利用Zxing编码与解码

    本教程将详细介绍如何在Android应用中利用Zxing进行编码与解码操作。 **1. Zxing简介** Zxing,又称为Google条码阅读器,是一个跨平台的开源库,用于读取和写入多种一维和二维条码格式。在Android中,Zxing提供了`...

    使用zxing开发的二维码/条形码/带logo彩色二维码例子

    ZXing(又称为“ZXing库”或“二维码扫描器”)是一个开源Java库,它支持多种一维条形码和二维条码格式,包括但不限于QRCode、DataMatrix、UPC-A、EAN-13等。该库不仅提供Java版本,还支持Android和iOS平台,使得...

    一维码二维码Java实现

    在IT行业中,一维码和二维码是数据编码与识别的重要技术,广泛应用于商品追溯、物流管理、信息交换等领域。在Java编程环境下,实现一维码和二维码的生成与解析是一项常见的任务。本篇将深入探讨如何利用Java进行一维...

    java二维码解析 zxing2.2及QRCode实现

    ZXing,通常被称为“条形码扫描器”,是一个开源项目,提供多种格式的一维和二维条码的读取和编写能力。ZXing 2.2版本是一个相对旧但仍然广泛使用的版本,它支持包括QR码在内的多种编码格式。在Java环境中,你可以...

Global site tag (gtag.js) - Google Analytics