二维码,又叫二维条码。
1.Java这边的话生成二维码有很多开发的jar包如 zxing,qrcode ,下面是使用zxing的开发包来实现的。
ZXing项目是google code上面提供的一个关于条码编解码的开源项目。
2.先下载zxing开发包,这里用到的只是core的jar包
我在项目中使用的core2.2.jar包。
下载地址:http://download.csdn.NET/download/tvcctv27tv/6841023
注:网上下载的core.jar使用JDK1.5;core2*.jar包使用JDK1.6;core3*.jar使用JDK1.7;
3. 源代码
- package com.test.qrcodes;
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Image;
- import java.awt.image.BufferedImage;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Hashtable;
- import javax.imageio.ImageIO;
- import junit.framework.Assert;
- import org.apache.commons.codec.binary.Base64;
- import org.apache.commons.lang.StringUtils;
- import com.google.zxing.BarcodeFormat;
- import com.google.zxing.EncodeHintType;
- import com.google.zxing.MultiFormatWriter;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
- public class TestQRCodes {
- private static final boolean NEEDCOMPRESS = false;
- private static String LOGO_URL;
- // LOGO宽度
- private static final int WIDTH = 60;
- // LOGO高度
- private static final int HEIGHT = 60;
- static{
- LOGO_URL = "";// 测试图片路径地址
- }
- /**
- * 生成二维码的工具类
- *
- * @param data
- * 二维码中携带的数据
- * @param width
- * 二维码的宽度
- * @param height
- * 二维码的高度
- * @return 返回base64格式的图片(data:image/gif;base64,xxxx) <br>
- * eg: <code>
- * <img alt="" src="data:image/gif;base64,xxxx">
- * </code>
- */
- public static String createQRCode(String data, int width, int height, String isPicture) {
- Assert.assertTrue("param data cannot empty.", data != null && data.trim().length() > 0);
- Assert.assertTrue("param width and height must gt 0.", width > 0 && height > 0);
- ByteArrayOutputStream bos = null;
- MultiFormatWriter formatWriter = new MultiFormatWriter();
- Hashtable<EncodeHintType, Object> param = new Hashtable<EncodeHintType, Object>();
- param.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
- param.put(EncodeHintType.CHARACTER_SET, "utf-8");
- param.put(EncodeHintType.MARGIN, 0);
- try{
- BitMatrix bitMatrix = formatWriter
- .encode(data, BarcodeFormat.QR_CODE, width, height, param);
- // 1.1去白边
- int[] rec = bitMatrix.getEnclosingRectangle();
- int resWidth = rec[2] + 1;
- int resHeight = rec[3] + 1;
- BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
- resMatrix.clear();
- for (int i = 0; i < resWidth; i++){
- for (int j = 0; j < resHeight; j++){
- if (bitMatrix.get(i + rec[0], j + rec[1])){
- resMatrix.set(i, j);
- }
- }
- }
- int width1 = resMatrix.getWidth();
- int height1 = resMatrix.getHeight();
- BufferedImage qrcode = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB);
- for (int x = 0; x < width1; x++){
- for (int y = 0; y < height1; y++){
- qrcode.setRGB(x, y, resMatrix.get(x, y) == true ? Color.BLACK.getRGB() : Color.WHITE
- .getRGB());
- }
- }
- // 添加logo图片
- if (StringUtils.isNotEmpty(LOGO_URL) && StringUtils.isNotEmpty(isPicture)){
- insertImage(width1, qrcode, LOGO_URL, NEEDCOMPRESS);
- }
- bos = new ByteArrayOutputStream();
- ImageIO.write(qrcode, "png", bos);
- String img = StringUtils.deleteWhitespace(Base64.encodeBase64String(bos.toByteArray()));
- return String.format("data:image/png;base64,%s", img);
- } catch (Exception e){
- throw new RuntimeException(e);
- } finally{
- if (bos != null){
- try{
- bos.close();
- } catch (IOException e){
- }
- }
- }
- }
- private static void insertImage(int QRCODE_SIZE, BufferedImage source, String imgPath,
- boolean needCompress) throws Exception {
- File file = new File(imgPath);
- if (!file.exists()){
- System.err.println("" + imgPath + " 该文件不存在!");
- return;
- }
- Image src = ImageIO.read(new File(imgPath));
- int width = src.getWidth(null);
- int height = src.getHeight(null);
- if (needCompress){ // 压缩LOGO
- if (width > WIDTH){
- width = WIDTH;
- }
- if (height > HEIGHT){
- height = HEIGHT;
- }
- Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
- BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- Graphics g = tag.getGraphics();
- g.drawImage(image, 0, 0, null); // 绘制缩小后的图
- g.dispose();
- src = image;
- }
- // 插入LOGO
- Graphics2D graph = source.createGraphics();
- int x = (QRCODE_SIZE - width) / 2;
- int y = (QRCODE_SIZE - height) / 2;
- graph.drawImage(src, x, y, width, height, null);
- // Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
- graph.setStroke(new BasicStroke(3f));
- // graph.draw(shape); 去除图片白边
- graph.dispose();
- }
- /**
- * @param data
- * 二维码携带的数据
- * @param size
- * 二维码的宽、高
- * @return
- * @see WechatValidateUtils#generateQRCode(String, int, int)
- */
- public static String createQRCode(String data, int size, String isPicture) {
- return createQRCode(data, size, size, isPicture);
- }
- // 测试
- public static void main(String[] args) throws Exception {
- // 生成二维码
- String url = "http://www.sina.com.cn";
- String src = createQRCode(url, 200, "1");
- System.out.println(url.length());
- String html = "<img src=\"" + src + "\">";
- FileOutputStream ops = new FileOutputStream("D:\\QRCodeImage\\test.html");
- org.apache.commons.io.IOUtils.write(html, ops, "utf-8");
- ops.close();
- }
- }