ZXing 是Google上的一个开源项目,功能强大, 可以支持各种条形码,二维码的编码和解码。
点这里可以了解原始项目情况。
http://code.google.com/p/zxing/
https://github.com/zxing/zxing
网上有很多关于ZXing 二维码使用的Demo.
不才仔细查看了Zxing的源代码,感觉有些类的封装和部分接口的设计不是特别适合我个人的口味。
1. 二维码的属性参数用Map的形式传入,初学者要仔细阅读文档后才能知道应该在Map里面放些什么东西,不那么直观。
2. MultiFormatWriter的encode 方法输入参数里面包含了输出图像的高和宽,本人私下认为没有这个必要。原因,一是二维码的行和列编码后已经明确了,例如一个50乘以50的二维码,如果用户输入一个49像素,或者75像素意义不大,49像素太小,75像素不是50的整数倍,这导致每个细胞的像素是1.5,毕竟没有半个像素这个说法,所以这样设计接口增加了内部逻辑的复杂度。
3.考虑到实际应用,输入就是一个字符串,输出一般就是个二维码,或者图片。所以接口最好也设计成这个样子,比较贴近生活。
4.本人注意到QRCode类的内部表示是一个byte型的二维数组,byte的取值范围大0~255,本人愚钝,本来还以为这里面存了什么复杂的数据, 但是实际上里面存储的只有0和1, 既然如此,不如改成 qrcode.jar 那个项目的风格,用boolean二维数组更加直接。
以下是本人重新封装的代码, 班门弄斧,让大家见笑。
Encoder.java
package home.ibm.tony.zxing.qrcode;
import java.awt.image.BufferedImage;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.encoder.QRCode;
public interface Encoder {
public BufferedImage encode2Image(String content)
throws WriterException;
public BufferedImage encode2Image(String content, QRCodeProperties properties)
throws WriterException;
public QRCode encode(String content)
throws WriterException;
public QRCode encode(String content, QRCodeProperties properties)
throws WriterException;
}
QRCodeEncoder.java
package home.ibm.tony.zxing.qrcode;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.encoder.QRCode;
public class QRCodeEncoder implements Encoder {
QRCodeProperties defaultProperties = new QRCodeProperties();
@Override
public BufferedImage encode2Image(String content) throws WriterException {
return convert(encode(content), defaultProperties);
}
@Override
public BufferedImage encode2Image(String content,
QRCodeProperties properties) throws WriterException {
return convert(encode(content), properties);
}
@Override
public QRCode encode(String content) throws WriterException {
return encode(content, defaultProperties);
}
@Override
public QRCode encode(String content, QRCodeProperties properties)
throws WriterException {
return com.google.zxing.qrcode.encoder.Encoder.encode(content,
properties.getErrorCorrection());
}
public static BufferedImage convert(QRCode qrcode, QRCodeProperties properties ){
int pixelSize = properties.getCellSize();
int margin = properties.getMargin();
boolean[][] result = toArray(qrcode);
int imageSize = result.length * pixelSize + margin * 2;
BufferedImage image = new BufferedImage(imageSize, imageSize,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setBackground(properties.getBgColor());
g.clearRect(0, 0, imageSize, imageSize);
g.setColor(properties.getFgColor());
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result.length; j++) {
if (result[j][i]) {
g.fillRect(j * pixelSize + margin, i * pixelSize + margin,
pixelSize, pixelSize);
}
}
}
g.dispose();
image.flush();
return image;
}
public static boolean[][] toArray(QRCode qrcode) {
byte[][] array = qrcode.getMatrix().getArray();
boolean[][] result = new boolean[array.length][array[0].length];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]);
result[i][j]= array[j][i] > 0 ? true : false;
}
System.out.println();
}
return result;
}
}
QRCodeProperties.java
package home.ibm.tony.zxing.qrcode;
import java.awt.Color;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class QRCodeProperties {
private Color bgColor = Color.WHITE;
private int cellSize = 3;
private ErrorCorrectionLevel errorCorrection = ErrorCorrectionLevel.M;
private Color fgColor = Color.BLACK;
private int margin = 2;
private int version = 6;
public Color getBgColor() {
return bgColor;
}
public int getCellSize() {
return cellSize;
}
public ErrorCorrectionLevel getErrorCorrection() {
return errorCorrection;
}
public Color getFgColor() {
return fgColor;
}
public int getMargin() {
return margin;
}
public int getVersion() {
return version;
}
public void setBgColor(Color bgColor) {
this.bgColor = bgColor;
}
public void setCellSize(int cellSize) {
this.cellSize = cellSize;
}
public void setErrorCorrection(ErrorCorrectionLevel errorCorrection) {
this.errorCorrection = errorCorrection;
}
public void setFgColor(Color fgColor) {
this.fgColor = fgColor;
}
public void setMargin(int margin) {
this.margin = margin;
}
public void setVersion(int version) {
this.version = version;
}
}
QRCodeDemo.java
package home.ibm.tony.zxing.qrcode;
import home.ibm.tony.qrcode.EnhancedQRCodeDecoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.google.zxing.WriterException;
public class QRCodeDemo {
public static void main(String[] args) throws IOException, WriterException {
String imgPath = "c:/z.png";
String encoderContent = "http://ieqq.iteye.com/blog/2114077";
QRCodeEncoder encoder = new QRCodeEncoder();
ImageIO.write(encoder.encode2Image (encoderContent), "png", new File(imgPath));
System.out.println("========encoder success");
}
}
分享到:
相关推荐
本示例项目“android zxing二维码demo”是基于ZXing库实现的一个简单应用,涵盖了扫描二维码、生成二维码以及读取图片中二维码内容的功能。 首先,我们来了解一下ZXing库。ZXing(发音为“zebra crossing”)是一个...
这个“ZXing二维码DEMO”是ZXing库的一个示例项目,旨在帮助开发者理解如何在自己的应用中集成二维码的生成与扫描功能。 首先,我们来看一下压缩包中的文件: 1. **proguard.cfg**:这是ProGuard配置文件,用于...
在集成zxing二维码时遇到预览拉伸的问题,原因:预览尺寸和surface view不一致。 解决方式: 针对于扫描时,二维码拉伸变形的问题,是因为zxing默认是针对横屏扫描的,所以,我们只需要改变x,y的计算,即横纵轴即可...
手机端的ZXing二维码扫描功能常用于移动应用中,比如扫描商品条码获取价格信息,或者扫描网页上的二维码快速跳转到相应页面。而Web端的JS二维码生成则广泛应用于网站,用户可以生成二维码分享网址、电子名片或者下载...
在这个"ZXing二维码扫描Demo程序"中,我们可以深入学习如何利用ZXing库在Android或Java平台上实现二维码的扫描和解析。 首先,我们来了解一下ZXing的主要功能。ZXing支持多种条码类型,如Code 39、Code 128、EAN-13...
在本示例"ZXing二维码识别和生成的demo"中,我们将探讨如何使用ZXing库来实现二维码的读取和创建,以及如何在生成的二维码中嵌入自定义的logo。 1. **二维码识别**: - ZXing提供了`BarcodeScanner`类,用于实时...
这个“ZXing二维码扫描demo完整源码”是一个已经封装好的示例项目,可以帮助开发者快速集成二维码扫描功能,只需少量代码即可实现。下面我们将深入探讨ZXing库以及如何利用它来创建二维码扫描应用。 1. **ZXing库...
这个"ZXing二维码扫描demo"是一个基于ZXing库的应用示例,主要用于演示如何在Android平台上实现二维码扫描功能。下面我们将深入探讨ZXing的核心原理、如何集成到Android应用中以及如何进行二维码扫描。 二维码...
1.详细的Demo 可正常扫描 2.zxing框架代码已简化,只保留了核心代码 2.包含zxing的核心包(中文乱码问题已处理) 3.有详细的扫描调用方法及说明 4.有详细的项目集成方法及说明 5.不明白可以直接看Demo
通过分析和运行`ZXing 3.2.0`的官方Demo,开发者能够了解二维码扫描和生成的整个流程,掌握如何在自己的项目中集成和定制ZXing,从而提升应用的功能性和用户体验。同时,这也是一个学习图像处理、移动开发和条码技术...
这个“android studio zxing二维码扫描 超级简单的demo”是一个针对Android Studio的示例项目,帮助开发者快速理解和集成二维码扫描功能到自己的应用中。 1. **ZXing库介绍** ZXing,又称“条形码彩虹”,是由...
【Zxing二维码扫描Demo完整源码下载】是一个针对Android应用开发者的资源,它包含了使用Zxing库实现二维码扫描、图片选择以及生成二维码图片的完整示例代码。Zxing,全称为“Zebra Crossing”,是一个开源的多格式一...
这个“Zxing二维码扫描和识别demo”是针对Android平台的一个学习资源,它简化了开发者在Android应用中集成二维码功能的过程。 1. **Zxing介绍** Zxing是由Google开发并维护的项目,最初为Google Book Search项目...
《Zxing二维码使用详解》 在当今信息化社会,二维码已经成为我们日常生活和工作中不可或缺的一部分,它在数据传输、信息获取等方面发挥了巨大作用。Zxing(ZXing,读作“zebra crossing”),全称“Zebra Crossing...
标题"收集的三个Zxing二维码扫描demo"表明这是一个包含三个使用Zxing实现的二维码扫描示例的集合。这些示例可能涵盖了不同的使用场景和功能,比如基本的扫描、定制扫描界面或者处理扫描结果等。通过研究这些示例,...
【Android 6.0 精简版ZXing二维码扫描生成Demo V1.1】是一个专为Android系统设计的应用程序开发示例,适用于Android 6.0及其以上版本。这个项目旨在提供一个轻量级的二维码扫描和生成功能,帮助开发者快速集成二维码...
本文将深入探讨如何使用ZXing.Net库在C#中创建支持中文的二维码,并提供一个简易的Demo示例。 ZXing(Zebra Crossing)是一个开源的、跨平台的条码读取库,也被称为Barcode Reader。它的.NET版本ZXing.Net由Michael...
ZXing,全称为“Zebra Crossing”,是一款开源的、跨平台的条码和二维码处理库。这个项目提供了多种功能,包括生成和读取多种类型的条形码和二维码,如QR码、Aztec码、PDF417等。在你的项目中,你已经使用了ZXing的...
【Android6.0精简zxing二维码扫描生成Demo】是一个基于Android 6.0操作系统的应用示例,它展示了如何使用ZXing(Zebra Crossing)库进行二维码的生成与扫描功能。ZXing是一个开源的、多平台的条码读取库,支持多种...
综上所述,这个"修改扫描框样式的ZXing二维码扫描DEMO"不仅展示了二维码扫描的基本功能,还强调了UI/UX设计的重要性,为开发者提供了一个参考实例,如何将ZXing库与自定义设计相结合,打造个性化的扫描体验。...