package qrcode;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import javax.imageio.ImageIO;
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.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
/**
* 利用zxing开源工具生成二维码QRCode
*
* @date 2013-04-11
* @author lxl
*
*/
public class QRCode {
private static final int BLACK = 0xff000000;
private static final int WHITE = 0xFFFFFFFF;
/**
* @param args
*/
public static void main(String[] args) {
QRCode test = new QRCode();
File file = new File("C://test.png");
/**
* 在com.google.zxing.MultiFormatWriter类中,定义了一些我们不知道的码,二维码只是其中的一种<br>
* public BitMatrix encode(String contents,
BarcodeFormat format,
int width, int height,
Map<EncodeHintType,?> hints) throws WriterException {
Writer writer;
switch (format) {
case EAN_8:
writer = new EAN8Writer();
break;
case EAN_13:
writer = new EAN13Writer();
break;
case UPC_A:
writer = new UPCAWriter();
break;
case QR_CODE: //这里是二维码
writer = new QRCodeWriter();
break;
case CODE_39:
writer = new Code39Writer();
break;
case CODE_128: //这个可以生成
writer = new Code128Writer();
break;
case ITF:
writer = new ITFWriter();
break;
case PDF_417: //这个可以生成
writer = new PDF417Writer();
break;
case CODABAR:
writer = new CodaBarWriter();
break;
default:
throw new IllegalArgumentException("No encoder available for format " + format);
}
return writer.encode(contents, format, width, height, hints);
}
*/
test.encode("中文二维码信息", file, BarcodeFormat.QR_CODE, 200, 200, null);
test.decode(file);
}
/**
* 生成QRCode二维码<br>
* 在编码时需要将com.google.zxing.qrcode.encoder.Encoder.java中的<br>
* static final String DEFAULT_BYTE_MODE_ENCODING = "ISO8859-1";<br>
* 修改为UTF-8,否则中文编译后解析不了<br>
*/
public void encode(String contents, File file, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints) {
try {
contents=new String(contents.getBytes("UTF-8"),"ISO-8859-1");//如果不想更改源码,则将字符串转换成ISO-8859-1编码
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, format, width, height);
writeToFile(bitMatrix, "png", file);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成二维码图片<br>
*
* @param matrix
* @param format
* 图片格式
* @param file
* 生成二维码图片位置
* @throws IOException
*/
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
ImageIO.write(image, format, file);
}
/**
* 生成二维码内容<br>
*
* @param matrix
* @return
*/
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) == true ? BLACK : WHITE);
}
}
return image;
}
/**
* 解析QRCode二维码
*/
@SuppressWarnings("unchecked")
public void decode(File file) {
try {
BufferedImage image;
try {
image = ImageIO.read(file);
if (image == null) {
System.out.println("Could not decode image");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
@SuppressWarnings("rawtypes")
Hashtable hints = new Hashtable();
//解码设置编码方式为:utf-8
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
result = new MultiFormatReader().decode(bitmap, hints);
String resultStr = result.getText();
System.out.println("解析后内容:" + resultStr);
} catch (IOException ioe) {
System.out.println(ioe.toString());
} catch (ReaderException re) {
System.out.println(re.toString());
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
}
分享到:
相关推荐
5. 使用第三方库或自定义解决方案:如果ZXing库仍然无法解决问题,可以考虑使用其他支持中文的条码/二维码读取库,或者自定义解码逻辑。 在提供的压缩包文件"ZXing"中,可能包含了ZXing库的源代码或者其他相关资源...
本项目针对ZXing进行了优化,特别是解决了中文乱码的问题,使得开发者在处理包含中文字符的二维码时能够更加顺利。以下是关于ZXing二维码开发以及解决中文乱码问题的详细知识点: 1. **ZXing框架概述**: ZXing是...
ZXing(Zebra Crossing)是一个开源的、多平台的条形码和二维码解码库,支持多种格式,如QR码、Data Matrix、Aztec、UPC等。在本项目中,ZXing被移植到了C++环境,并且集成了OpenCV库,提供了与OpenCV兼容的接口,...
Zxing是Google开发的一个开源项目,用于读取和生成多种一维和二维条码,包括但不限于QR码、Data Matrix、UPC和EAN商品条码。它提供了跨平台的Java库以及多种客户端应用,其中Android客户端支持直接在手机上扫描和...
在Windows Forms(Winform)应用开发中,生成包含中文字符...同时,了解扫码工具的兼容性也很重要,以确保用户能顺利读取二维码中的信息。通过使用成熟的库和正确的编码策略,可以轻松地在Winform应用中实现这一功能。
ZXing,全称为“Zebra Crossing”,是一款开源的、跨平台的条码和二维码读取库。这个项目在Java平台上创建,但已经被移植到多个其他编程语言,包括Android。ZXing(读作“zebra crossing”)这个名字来源于交通斑马...
ZXing是一个开源的、跨平台的条码和二维码读取与生成库,而QrCodeDelphi则是专为Delphi设计的轻量级二维码生成组件。这里我们以ZXing为例,介绍如何在Delphi项目中集成二维码生成功能。 1. 集成ZXing库: - 下载...
本篇文章将深入探讨如何在C#编程环境中实现支持中文的二维码生成,以及解决乱码问题。 首先,我们需要理解二维码的工作原理。二维码是一种二维条形码,通过矩阵式编码技术存储数据,可以包含文字、数字、URL等多种...
《ZXing iOS版中文乱码问题的解决方案及Demo解析》 在iOS开发中,集成二维码和条形码扫描功能时,ZXing库是一个常见的选择。然而,开发者在使用ZXing时,常常会遇到一个问题——扫描中文内容时出现乱码。这无疑给...
本篇文章将深入探讨如何在Java中实现这个功能,并解决可能遇到的中文乱码问题。 首先,我们需要一个可靠的二维码生成库。在Java世界里,ZXing(Zebra Crossing)是一个广泛使用的开源库,它提供了多种二维码和条形...
这个问题的解决意味着现在ZXing能够正确地读取和展示含有中文字符的二维码,这对于中国及全球其他使用汉字的语言环境来说至关重要。 在开发过程中,如果遇到类似的问题,开发者可能需要确保二维码的数据编码与解码...
通过以上步骤,我们可以构建一个完整的二维码生成和识别系统,覆盖了从数据编码到图像处理再到解码的过程,同时解决了汉字乱码的问题。这个系统可以应用于各种场景,如信息交换、网址跳转、名片分享等。
Zxing和Zbar是两个流行的开源库,专门用于二维码和条形码的读取与解析。下面将详细介绍这两个库以及如何在Android项目中使用它们。 **1. Zxing(ZXing,意为“Zebra Crossing”)** Zxing是一个开放源代码的Java库...
Zxing库就支持多种条码和二维码格式,包括EAN-13、QR Code、Code 128等。 6. **优化扫描体验**: 提高扫描速度和准确性是提升用户体验的关键。这可以通过优化图像预处理,如裁剪、灰度化和二值化,以及调整扫描...
2. **解决中文乱码问题**:在处理包含非英文字符的编码时,可能会出现乱码。项目开发者通过调整字符编码设置,确保了中文和其他多语言字符的正确显示,这是对ZBar原生功能的一个重要改进。 3. **自定义扫描框**:...
ZXing是一个多功能的条码读取和生成库,支持多种条码格式,包括QR码。以下将详细介绍如何在Java项目中实现这一功能。 ### 1. Maven依赖 首先,我们需要在项目的pom.xml文件中添加ZXing库的依赖。以下为添加依赖的...
在Android应用中集成ZBar,可以方便地实现在设备摄像头的帮助下读取二维码信息。 首先,你需要在项目中添加ZBar库。如果你使用的是Gradle构建系统,可以在app的build.gradle文件中添加依赖项: ```groovy ...