码迷,mamicode.com
首页 > 编程语言 > 详细

java创建二维码与解析二维码

时间:2015-03-10 18:39:08      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

                                                                                            技术分享

本人之前做项目的时候,下载手机客户端的时候用到了二维码扫面下载,总以为很困难,研究了一段时间,也就那样,在这和大家分享一下。

<1>首先是下载包:core.jar和QRCode.jar

<2>就是把包放到你的项目去(就不截图了,嘿嘿~~)

 

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;

import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

public class TwoDimensionCode {

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param imgPath 图片路径

   */

  public void encoderQRCode(String content, String imgPath) {

    this.encoderQRCode(content, imgPath, "png", 7);

  }

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param output 输出流

   */

  public void encoderQRCode(String content, OutputStream output) {

    this.encoderQRCode(content, output, "png", 7);

  }

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param imgPath 图片路径

   * @param imgType 图片类型

   */

  public void encoderQRCode(String content, String imgPath, String imgType) {

    this.encoderQRCode(content, imgPath, imgType, 7);

  }

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param output 输出流

   * @param imgType 图片类型

   */

  public void encoderQRCode(String content, OutputStream output, String imgType) {

    this.encoderQRCode(content, output, imgType, 7);

  }

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param imgPath 图片路径

   * @param imgType 图片类型

   * @param size 二维码尺寸

   */

  public void encoderQRCode(String content, String imgPath, String imgType, int size) {

    try {

      BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

      File imgFile = new File(imgPath);

      // 生成二维码QRCode图片

      ImageIO.write(bufImg, imgType, imgFile);

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

  /**

   * 生成二维码(QRCode)图片

   * 

   * @param content 存储内容

   * @param output 输出流

   * @param imgType 图片类型

   * @param size 二维码尺寸

   */

  public void encoderQRCode(String content, OutputStream output, String imgType, int size) {

    try {

      BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

      // 生成二维码QRCode图片

      ImageIO.write(bufImg, imgType, output);

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

  /**

   * 生成二维码(QRCode)图片的公共方法

   * 

   * @param content 存储内容

   * @param imgType 图片类型

   * @param size 二维码尺寸

   * @return

   */

  private BufferedImage qRCodeCommon(String content, String imgType, int size) {

    BufferedImage bufImg = null;

    try {

      Qrcode qrcodeHandler = 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 = new BufferedImage(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 {

        throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");

      }

      gs.dispose();

      bufImg.flush();

    } catch (Exception e) {

      e.printStackTrace();

    }

    return bufImg;

  }

  /**

   * 解析二维码(QRCode)

   * 

   * @param imgPath 图片路径

   * @return

   */

  public String decoderQRCode(String imgPath) {

    // QRCode 二维码图片的文件

    File imageFile = new File(imgPath);

    BufferedImage bufImg = null;

    String content = null;

    try {

      bufImg = ImageIO.read(imageFile);

      QRCodeDecoder decoder = new QRCodeDecoder();

      content = new String(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;

  }

  /**

   * 解析二维码(QRCode)

   * 

   * @param input 输入流

   * @return

   */

  public String decoderQRCode(InputStream input) {

    BufferedImage bufImg = null;

    String content = null;

    try {

      bufImg = ImageIO.read(input);

      QRCodeDecoder decoder = new QRCodeDecoder();

      content = new String(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;

  }

  public static void main(String[] args) {

  //二维码存放地址

     String imgPath = "E:/201314.png";

     //二维码存放内容

     String encoderContent = "小龙驿站!";

     TwoDimensionCode handler = new TwoDimensionCode();

     handler.encoderQRCode(encoderContent, imgPath, "png");

     try {

       OutputStream output = new FileOutputStream(imgPath);

       handler.encoderQRCode(encoderContent, output);

      } catch (Exception e) {

       e.printStackTrace();

      }

     System.out.println("========encoder success");

     String decoderContent = handler.decoderQRCode(imgPath);

     System.out.println("解析结果如下:");

     System.out.println(decoderContent);

     System.out.println("========decoder success!!!");

  }

}

源码链接 详情

 

java创建二维码与解析二维码

标签:

原文地址:http://www.cnblogs.com/zzaisky/p/4326393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!