`

二维条形码的生成与解析

阅读更多
二维条形码的生成与解析

参考文章

<dependency>
	<groupId>com.google.zxing</groupId>
	<artifactId>core</artifactId>
	<version>1.7</version>
</dependency>
<dependency>
	<groupId>com.google.zxing</groupId>
	<artifactId>javase</artifactId>
	<version>1.7</version>
</dependency>


package util.qrcode;

import java.awt.image.BufferedImage;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Hashtable;
import java.util.List;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;


public class QRCodeUtils {

	/** 私有构造方法 */
	private QRCodeUtils() { super(); }
	
	private static final Hashtable<EncodeHintType, Object> ZXING_HINTS;
	
	static {
		ZXING_HINTS = new Hashtable<EncodeHintType, Object>();
		ZXING_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		ZXING_HINTS.put(EncodeHintType.CHARACTER_SET, "UTF-8");
	}
	
	/**
	 * 将二维码写入数据流
	 * 
	 * @param out 数据流
	 * @param lines 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToOutputStream(OutputStream out, List<String> lines, int width, int height) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < lines.size(); i ++) {
			sb.append(lines.get(i));
			if (i != lines.size() - 1) {
				sb.append("\n");
			}
		}
		writeToOutputStream(out, sb.toString(), width, height);
	}
	
	/**
	 * 将二维码写入数据流
	 * 
	 * @param out 数据流
	 * @param contents 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToOutputStream(OutputStream out, String contents, int width, int height) {
		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
			MatrixToImageWriter.writeToStream(bitMatrix, "png", out);
		} catch (WriterException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
	
	/**
	 * 将二维码写入文件
	 * 
	 * @param file 文件
	 * @param lines 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToFile(File file, List<String> lines, int width, int height) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < lines.size(); i ++) {
			sb.append(lines.get(i));
			if (i != lines.size() - 1) {
				sb.append("\n");
			}
		}
		writeToFile(file, sb.toString(), width, height);
	}
	
	/**
	 * 将二维码写入文件
	 * 
	 * @param file 文件
	 * @param contents 数据
	 * @param width 二维码宽度
	 * @param height 二维码高度
	 */
	public static void writeToFile(File file, String contents, int width, int height) {
		try {
			BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
			MatrixToImageWriter.writeToFile(bitMatrix, "png", file);
		} catch (WriterException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 解析二维码
	 * 
	 * @param image 图片
	 * @return 信息
	 */
	public static String decode(BufferedImage image) {
		Result result = null;
		LuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		try {
			result = new MultiFormatReader().decode(bitmap, ZXING_HINTS);
		} catch (NotFoundException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return result.getText();
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param file 图片
	 * @return 信息
	 */
	public static String decode(File file) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(file);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param input 图片
	 * @return 信息
	 */
	public static String decode(InputStream input) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(input);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 解析二维码
	 * 
	 * @param url 图片
	 * @return 信息
	 */
	public static String decode(URL url) {
		BufferedImage image = null;
		try {
			image = ImageIO.read(url);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
		return decode(image);
	}
	
	/**
	 * 关闭
	 * 
	 * @param closeable 关闭对象
	 */
	public static void closeQuietly(Closeable closeable) {
		if (closeable == null) return;
		try { closeable.close(); } catch (Exception e) {}
	}
}
分享到:
评论

相关推荐

    条码生成与解析

    一维码 、二维码 、条形码生成与解析,有完整的代码。

    二维码,条形码,生成与解析

    里面有jar,已经事例,代码,打开可以直接使用,

    java二维码生成与解析代码实现(内含核心包QRCode.jar)

    java二维码生成与解析源码内含核心包文件QRCode.jar。 二维码的特点: 1. 高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。 2. 编码...

    Java生成和解析二维码

    Java实现生成和解析二维码...二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

    基于Android的二维码的生成与识别系统的设计与实现_马鸣.caj

    统内容包括两部分:二维条码的生成系统设计和二维条码的识别系统设计。生成系统完成了从输入数据到生成相应二维 码的功能,识别系统完成对采集到的二维码符号进行译码还原出所携带信息的功能。

    java生成和解析二维码demo源码

    3.容错能力强,具有纠错功能:这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。 4.译码可靠性高:它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分...

    生成和解析二维码所需的zxing.dll

    ZXing库是一个开源Java类库,可用于生成和解析多种格式的1D/2D条形码,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的...

    Java二维码解析和生成库zxing

    支持多种格式的一维、二维条形码图片处理开发库。

    asp.net生成和解析二维码

    QR码用数据压缩方式表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%。QR具有4个等级的纠错功能,即使破损也能够正确识读。QR码抗弯曲的性能强,通过QR码中的每隔一定的间隔配置有校正...

    SpringBoot整合ZXing生成和解析二维码详解含源码(值得珍藏)

    - ZXing是一个开源的条码识别软件,包括多种一维和二维条码的解码功能。 - 它支持多种类型的条码,包括QR码、Data Matrix、EAN-13、Code 39等。 - ZXing的优点在于它能够快速准确地读取和解析各种类型的条码。 - 它...

    QRCode二维码

    最近项目用到了条码打印等功能,所以顺便学习下条码的知识,目前网上这里信息确实很多,我也直接拿来用的。 只是在各位前辈的基础...4.QR Code码制的二维条码生成 5.二维码制的解析功能 感兴趣的童鞋可以拿去用哦!!

    .NET C#利用ZXing生成、识别二维码/条形码

    二、生成二维码 .NET 平台的代码始终要简单些。 QrCodeEncodingOptions options = new QrCodeEncodingOptions(); options.CharacterSet = UTF-8; options.DisableECI = true; // Extended Channel Int

    QRCode.jar

    QRcode是一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。可以使用QRCode.jar生成与解析二维码。

    zxing.java源码解析-ZxingDemo:二维码库Zxing的总结

    二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode二维条形码扫描仪——BitmapFactory.decodeByteArray 10.6 上班族今天中午要吃什么——热量骰子地图 10.7 掷杯筊——把手机放在...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode二维条形码扫描仪——BitmapFactory.decodeByteArray 10.6 上班族今天中午要吃什么——热量骰子地图 10.7 掷杯筊——把手机放在...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode二维条形码扫描仪——BitmapFactory.decodeByteArray 10.6 上班族今天中午要吃什么——热量骰子地图 10.7 掷杯筊——把手机放在...

    Google Android SDK开发范例大全的目录

    10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode二维条形码扫描仪——BitmapFactory.decodeByteArray 10.6 上班族今天中午要吃什么——热量骰子地图 10.7 掷杯筊——把手机放在...

    Google+Android+SDK开发范例大全

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

Global site tag (gtag.js) - Google Analytics