`

二维条形码的生成与解析

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

参考文章

<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) {}
	}
}
分享到:
评论

相关推荐

    基于VB的128位二维条形码生成工具附源码.rar

    VB源码-图形处理的标签,说明了这个项目与图像处理有关,特别是涉及到生成和可能的显示或打印二维条形码。Visual Basic 提供了丰富的图形库和API,允许开发者创建图形界面并处理图像,包括生成条形码。在这个工具中...

    公文二维条码生成器

    公文二维条码生成器是一种专门针对公文处理的软件工具,它能够为各类公文快速生成二维条码。在信息化办公的今天,二维条码技术已经广泛应用在文档管理、流转跟踪、信息加密等多个环节,提高了公文处理的效率和安全性...

    android二维码条形码(一维码)生成、扫描和解析

    二维码是一种二维条形码,可以存储更多的信息,如网址、文本、联系人信息等,而一维码(如EAN或UPC)通常用于商品的标识,存储的信息量相对较少。 **生成二维码和条形码** 1. **集成库**: Android中常用的库有`...

    二维条码生成与识别程序源码.rar

    本资源“二维条码生成与识别程序源码.rar”包含了一个C++开发的二维条码生成与识别系统,对于想要深入理解或集成此类功能的开发者来说,是一个宝贵的参考资料。 首先,我们要了解二维条码的基本概念。二维条码相比...

    Java做的二维条码生成控件

    在IT行业中,利用编程语言如Java实现二维条码的生成与解析,可以极大地提高数据处理的效率和安全性。Java做的二维条码生成控件就是这样的一个工具,它允许开发者将数据编码为二维条码图像,以便于读取和保护。 首先...

    二维条形码生成库,CBarCode类

    4. **解码功能**:除了生成,CBarCode类也可能支持解码功能,从已有的二维条形码图像中读取并解析出其中的数据,这对于验证条形码的正确性和读取信息至关重要。 5. **错误处理和兼容性**:一个完整的库会包含对各种...

    二维的生成与解析,包含zxing-code.jar包

    这个库不仅支持二维码,还支持一维条形码,如EAN-13、UPC-A等。让我们深入了解一下ZXing库如何帮助我们实现二维码的生成与解析。 **一、二维码生成** 生成二维码的过程涉及以下几个步骤: 1. **数据编码**:首先...

    jsp 二维条码生成例子

    在IT行业中,二维条码(二维码)已经成为数据传输和信息记录的重要工具,特别是在移动设备上。JSP(JavaServer Pages...对于初学者而言,这个例子是一个很好的起点,能够深入理解JSP开发以及二维条码生成的原理和实践。

    条码生成与解析

    在IT行业中,条码生成与解析是数据管理与自动化流程中的关键组成部分。一维码、二维码和条形码是常见的编码系统,它们被广泛应用于商品追踪、库存管理、物流跟踪等多个领域。本教程将深入探讨这些编码技术以及如何在...

    vc编写的二维条码算法源代码

    在给定的标题“vc编写的二维条码算法源代码”中,我们可以推断这是一份使用C++编程语言(VC通常指的是Visual C++)实现的二维条形码生成与解析的源代码。这种源代码可能包含了对二维条形码格式的理解,如PDF417、QR ...

    二维条码的生成代码和开发包

    二维条码,全称是二维矩阵式条形码,是一种比一维条形码更高效的数据编码方式,能够存储大量的信息,包括文字、数字、图片等。在IT行业中,二维条码的应用广泛,如产品追溯、电子票务、文档管理等领域。本资源包含了...

    条形码生成资源(一维和二维)

    二维条形码的生成软件,通常会提供界面友好的操作方式,用户输入需要编码的信息,软件自动生成对应的二维码图形。该资源包中可能包含了这样的软件,同时附带了操作说明手册,可以帮助用户理解和使用这些工具。 ...

    Android_条码扫描器_一维条形码_二维QR码_apk_源码

    这个"Android_条码扫描器_一维条形码_二维QR码_apk_源码"压缩包文件很可能是ZXing库的一个实现,包含了完整的Android应用源码,用于演示如何在Android项目中集成和使用ZXing进行条码扫描。 1. **ZXing库介绍** ...

    条码生成器.NET源代码(可生成二维条码等多种条码)

    《.NET条码生成器:实现二维条码与多种条码的源代码解析》 在IT行业中,条码技术广泛应用于商品管理、物流追踪、库存控制等领域,它以高效、准确的方式传递信息。本文将围绕标题《条码生成器.NET源代码(可生成二维...

    一维二维条码的原理和应用设计技术

    5. **软件工具**:开发过程中,会用到条码生成器和解析库,这些工具可以帮助快速创建和解码条码。例如,开源的ZXing(Zebra Crossing)库支持多种一维和二维条码的读写。 6. **应用集成**:条码技术常与ERP、CRM...

    二维码/条形码生成与扫描

    QR码是一种二维条形码,能存储更多的信息,如网址、文本、联系人信息等。在本项目中,libqrencode被用来将用户提供的数据转化为QR码图像,适用于打印、显示或扫描。 Bar Code库可能是指一个通用的条形码生成库,它...

    二维条码的JAVA资源

    与一维条码相比,二维条码能在更小的空间内存储更多的数据,甚至可以包含文字、图片等非数字信息。常见的二维条码类型有QR码、DataMatrix、PDF417等。它们通过矩阵结构存储信息,提高了信息密度和安全性。 在Java中...

    C# 二维码的生成与解析

    二维码(Quick Response Code)是一种二维条形码,能够存储比传统一维条形码更多的数据,包括字母、数字、符号甚至汉字。通过特定的编码算法,将这些信息转化为矩阵图形,然后通过摄像头或其他扫描设备读取并解码。 ...

    二维条码和一维条码Demo

    3. **错误校验**:对于二维条码,Demo可能还包括了错误检测和纠正机制的演示,以展示即使条码部分受损,数据仍然可以被正确解析。 4. **兼容性测试**:可能有不同类型的条码和不同的扫描设备设置,以检验条码在各种...

    二维码/条形码生成与扫描源码

    二维码(Quick Response Code)是一种二维条形码,它能够存储更多的信息,如网址、文本、联系方式等,同时还能在多个方向上进行读取,提高了数据的读取速度和准确性。条形码(Barcode)则是一维的,通常用于标识商品...

Global site tag (gtag.js) - Google Analytics