java利用zxing来生成和解析二维码,支持中文

来源:互联网 发布:数据分析师难考吗 编辑:程序博客网 时间:2024/05/20 03:05

java在二维码的生成和解析上,网上有些人说如果要解析中文,得去修改工具包的Encoder类中的 static final String DEFAULT_BYTE_MODE_ENCODING = "ISO8859-1";
将编码改成utf-8或者gbk,这种方式可行,不过破坏了封装的原则,而且还得重新编译,特别是这种依赖于第三方的东西,如果谷歌将zXing包又升级了,而你也想跟着升级
到最新的版本,是不是又得去改一次那个编码,然后再编译一次替换,这样的话这种处理方式不是那么的方便,事实上其实可以不用去改里面的编码,我们只要在解析和

生成的时候将中文字符串转化一下就可以了,下面是java利用zxing包对相关信息生成和解析二维码的一个简单代码,可参照一下,暂时我就用这种方式处理

package com.gen;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

/**
 * 简单利用谷歌的zXing包来生成和解析二维码QRCode
 *
 * @date 2014-06-12
 * @author aGuang
 *
 */
public class QrCode {
 //此处定义颜色的16位进制值,可换其他颜色,不过一般使用黑白颜色来生成
 private static final int BLACK = 0xff000000;
 private static final int WHITE = 0xFFFFFFFF;

 /**
  * @param args
  */
 public static void main(String[] args) {
  QrCode qrc = new QrCode();

  //文件的后缀名
  String filePostfix = "png";
  File file = new File("C:/Users/Administrator/Desktop/二维码." + filePostfix);
  String context = "中文测试" + 123 + ",./";
  
  //调用封装的生成函数
  qrc.encode(context, file, filePostfix, BarcodeFormat.QR_CODE,
    200, 200, null);
  qrc.decode(file);
 }

 /**
  *
  * 此处生成QRCode二维码<br>
  *
  * @param contents
  *            二维码的内容
  * @param file
  *            二维码生成的文件
  * @param filePostfix
  *            生成二维码图片的格式,可以用PNG或JPG或GIF等等
  * @param format
  *            qrcode码的生成格式
  * @param width
  *            图片宽度
  * @param height
  *            图片高度
  * @param hints
  */
 public void encode(String contents, File file, String filePostfix,
   BarcodeFormat format, int width, int height,
   Map<EncodeHintType, ?> hints) {
  try {
   BitMatrix bitMatrix = new MultiFormatWriter().encode(new String(contents.getBytes("GBK"),"ISO8859-1"),
     format, width, height);
   catchToFile(bitMatrix, filePostfix, file);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 生成二维码图片<br>
  *
  * @param matrix
  * @param format
  *            图片格式
  * @param file
  *            生成二维码图片位置
  * @throws IOException
  */
 public static void catchToFile(BitMatrix matrix, String format, File file)
   throws IOException {
  BufferedImage image = toBufferedImage(matrix);
  ImageIO.write(image, format, file);
 }

 /**
  * 生成二维码内容<br>
  *
  * @param matrix
  * @return
  */
 public static BufferedImage toBufferedImage(BitMatrix matrix) {
  int width = matrix.getWidth();
  int height = matrix.getHeight();
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_ARGB);
  for (int x = 0; x < width; x++) {
   for (int y = 0; y < height; y++) {
    image.setRGB(x, y, matrix.get(x, y) == true ? BLACK : WHITE);
   }
  }
  return image;
 }

 /**
  * 解析二维码内容
  */
 @SuppressWarnings("unchecked")
 public void decode(File file) {
  try {
   BufferedImage image;
   try {
    image = ImageIO.read(file);
    if (image == null) {
     System.out.println("该文件不能解码");
    }
    LuminanceSource source = new BufferedImageLuminanceSource(image);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
      source));
    Result result;
    Hashtable hints = new Hashtable();
    // 解码设置编码方式为:GBK
    hints.put(DecodeHintType.CHARACTER_SET, "GBK");
    result = new MultiFormatReader().decode(bitmap, hints);
    String resultStr = result.getText();
    System.out.println("解析后的内容为:" + resultStr);
   } catch (IOException ioe) {
    ioe.printStackTrace();
   } catch (ReaderException re) {
    re.printStackTrace();
   }
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

注:当前二维码的生成及解析另外需要依赖于包zxing 的core.jar 与javase.jar

javase.jar下载http://download.csdn.net/detail/aguang_vip/7487129

core.jar下载http://download.csdn.net/detail/aguang_vip/7487117

0 0
原创粉丝点击