你的位置:首页 > Java教程

[Java教程]Google Zxing


Google Zxing

最近在某论坛上看到Zxing 这个插件 , 决定用用 !首先它是用于生成二维码的 , 类似于登录时的验证码 , 他也是从后台生成一张图片 , 只不过二维码图案涉及一定算法 , 并且有一定的规律 ,这些都是前辈们定好了 ,并且已经把这里面复杂的代码封装了 , 接下来的工作就简单了!相关文章: http://developer.51cto.com/art/201310/414082_all.htm

首先在网上搜索Zxing ,或者去 maven repository 下载zxing jar!

1、手动添加如下代码(核心实现)

 1 package com.wisesoft.ztree.util; 2 import com.google.zxing.common.BitMatrix; 3 import javax.imageio.ImageIO; 4 import java.io.File; 5 import java.io.OutputStream; 6 import java.io.IOException; 7 import java.awt.image.BufferedImage; 8 public final class MatrixToImageWriter { 9   private static final int BLACK = 0xFF000000;10   private static final int WHITE = 0xFFFFFFFF;11   private MatrixToImageWriter() {12   }13   public static BufferedImage toBufferedImage(BitMatrix matrix) {14     int width = matrix.getWidth();15     int height = matrix.getHeight();16     BufferedImage image = new BufferedImage(width, height,17         BufferedImage.TYPE_INT_RGB);18     for (int x = 0; x < width; x++) {19       for (int y = 0; y < height; y++) {20         image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);21       }22     }23     return image;24   }25   public static void writeToFile(BitMatrix matrix, String format, File file)26       throws IOException {27     BufferedImage image = toBufferedImage(matrix);28     if (!ImageIO.write(image, format, file)) {29       throw new IOException("Could not write an image of format "30           + format + " to " + file);31     }32   }33   public static void writeToStream(BitMatrix matrix, String format,34       OutputStream stream) throws IOException {35     BufferedImage image = toBufferedImage(matrix);36     if (!ImageIO.write(image, format, stream)) {37       throw new IOException("Could not write an image of format "38           + format);39     }40   }41 }42 43           

MatrixToImageWriter

“matrix.get(x, y) ? BLACK : WHITE”  MatrixToImageWriter 类是绘制图形的核心类 , 通过循环每一个像素点 , 并且询问BitMatrix.get(x,y)返回时true或者false 决定绘制黑白条纹

2、二维码规格定义部分

 1 package com.wisesoft.ztree.controller; 2 import java.io.IOException; 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import com.google.zxing.BarcodeFormat; 8 import com.google.zxing.MultiFormatWriter; 9 import com.google.zxing.WriterException;10 import com.google.zxing.common.BitMatrix;11 import com.wisesoft.ztree.util.MatrixToImageWriter;12 13 @Controller14 @RequestMapping("/qr")15 public class QRController {16   @RequestMapping("put")17   public void qr(HttpServletRequest req,HttpServletResponse resp) throws WriterException, IOException{18     String contents = "http://sqdd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk"; //二维码链接地址19     int width = 300;  //生成二维码宽度20     int height = 300;  //高度21     String format = "png"; //二维码文件格式 22     BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height); //xzing插件核心,将参数传入23     //MatrixToImageWriter.writeToFile(bitMatrix,format, new File("D:\\qq_download.png")); //将生成的二维码写入文件中24     MatrixToImageWriter.writeToStream(bitMatrix,format, resp.getOutputStream()); //将生成的二维码放入流中25     //MatrixToImageWriter.toBufferedImage(matrix); 26   }27 }

QRController

writeToStream 的三个参数 , 第一个是BitMatrix对象 ,第二个 是format为图片格式 ,第三个是一个输出流对象

如果format格式不对:

MatrixToImageWriter.writeToStream(bitMatrix,"aaaaa", resp.getOutputStream());

异常:

"Could not write an image of format aaaaa"