欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java利用zxing编码解码一维码与二维码 博客分类: JAVA、WEB开发 zxing二维码一维码qrcode编码解码 

程序员文章站 2024-03-24 17:15:40
...
  最近琢磨了一下二维码、一维码的编码、解码方法,感觉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);
    }  
  
}