ZXing 二维码 Demo 博客分类: 代码演示 zxingqrcodedemo二维码
程序员文章站
2024-03-24 17:07:22
...
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
QRCodeEncoder.java
QRCodeProperties.java
QRCodeDemo.java
点这里可以了解原始项目情况。
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"); } }