JAVA生成二维码

前两天工做须要上网查了一下JAVA生成二维码程序的方法,试了几种都全报一此小BUG,而且在二维码中添加LOGO的会没法解析,后来调整一下生成的信息量,便能正常生成了,二维生成的原理相似于针孔打印机原理。下面上代码:html

 说明:须要用到jar工具包为QRCode.jar java

 

 

类1:数组

package com.tyzs.util;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;


public class TwoDimensionCodeImage implements QRCodeImage {

 BufferedImage bufImg;

 public TwoDimensionCodeImage(BufferedImagebufImg) {
  this.bufImg = bufImg;
 }

 public int getHeight() {
  returnbufImg.getHeight();
 }

 public int getPixel(int x, int y) {
  return bufImg.getRGB(x,y);
 }

 public int getWidth() {
  return bufImg.getWidth();
 }

}


 

 

类2:工具

package com.tyzs.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;


public class TwoDimensionCode {

 
 public void encoderQRCode(String content, StringimgType, int size,
   StringimagePath) {
  BufferedImage bufImg =null;
  try {
   QrcodeqrcodeHandler = new Qrcode();
   //设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
   qrcodeHandler.setQrcodeErrorCorrect('M');
   qrcodeHandler.setQrcodeEncodeMode('B');
   //设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
   qrcodeHandler.setQrcodeVersion(size);
   //得到内容的字节数组,设置编码格式
   byte[]contentBytes = content.getBytes("utf-8");
   // 图片尺寸
   int imgSize =67 + 12 * (size - 1);
   bufImg = newBufferedImage(imgSize, imgSize,
     BufferedImage.TYPE_INT_RGB);
   Graphics2D gs= bufImg.createGraphics();
   //设置背景颜色
   gs.setBackground(Color.WHITE);
   gs.clearRect(0,0, imgSize, imgSize);

   //设定图像颜色> BLACK
   gs.setColor(Color.BLACK);
   //设置偏移量,不设置可能致使解析出错
   int pixoff =2;
   // 输出内容>二维码
   if(contentBytes.length > 0 && contentBytes.length <800) {
    boolean[][]codeOut = qrcodeHandler.calQrcode(contentBytes);
    for(int i = 0; i < codeOut.length; i++) {
     for(int j = 0; j < codeOut.length; j++) {
      if(codeOut[j][i]) {
       gs.fillRect(j* 3 + pixoff, i * 3 + pixoff, 3, 3);
      }
     }
    }
   } else{
    thrownew Exception("QRCode content bytes length = "
      +contentBytes.length + " not in [0, 800].");
   }
   //LOGO
   

   gs.dispose();
   bufImg.flush();
  } catch (Exception e) {
   e.printStackTrace();
  }

  // 生成二维码QRCode图片
  try {
   File imgFile= new File(imagePath);
   ImageIO.write(bufImg,imgType, imgFile);
  } catch (IOException e) {
   // TODOAuto-generated catch block
   e.printStackTrace();
  }

 }

 
 public String decoderQRCode(String imgPath){
  // QRCode 二维码图片的文件
  File imageFile = newFile(imgPath);
  BufferedImage bufImg =null;
  String content = null;
  try {
   bufImg =ImageIO.read(imageFile);
   QRCodeDecoderdecoder = new QRCodeDecoder();
   content = newString(decoder.decode(new TwoDimensionCodeImage(
     bufImg)),"utf-8");
  } catch (IOException e) {
   System.out.println("Error:" + e.getMessage());
   e.printStackTrace();
  } catch(DecodingFailedException dfe) {
   System.out.println("Error:" + dfe.getMessage());
   dfe.printStackTrace();
  }
  return content;
 }

}


 

类3:测试类测试

package com.tyzs.test;

import com.tyzs.util.TwoDimensionCode;

public class Test {
 public static void main(String[] args) {
  String imgPath ="F:/test.png";
  String encoderContent ="http://www.weibo.com/tuanyaozhishang";
  TwoDimensionCode handler = newTwoDimensionCode();
  handler.encoderQRCode(encoderContent,"png", 20, imgPath); // 内容 图片路径

  // 图片格式 大小

  System.out.println("========encodersuccess");

  String decoderContent =handler.decoderQRCode(imgPath); // 图片路径
  System.out.println("解析结果以下:");
  System.out.println(decoderContent);
  System.out.println("========decodersuccess!!!");
 }
}


效果图以下:this

 

JAVA生成二维码   JAVA生成二维码

 

JAVA生成二维码


        后记:关于jar能够去网上下载,也能够给我留言索要,这里logo的路径我写死了,你也能够在生成方法中添加一个logo的路径参数,方便调用。  技术路很长,努力积累即是海洋!    抟摇直上 2013-08-12编码

 

转载说明:http://blog.sina.com.cn/s/blog_918966b40101budt.htmlurl