二维码生成Java实现代码

本文实例为大家分享了二维码生成Java实现代码,供大家参考,具体内容如下

package com.yihaomen.barcode;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;

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.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 二维码工具类
 *
 */
public class QRCodeUtil {

 private static final String CHARSET = "utf-8";
 private static final String FORMAT_NAME = "JPG";
 // 二维码尺寸
 private static final int QRCODE_SIZE = 300;
 // LOGO宽度
 private static final int WIDTH = 60;
 // LOGO高度
 private static final int HEIGHT = 60;

 private static BufferedImage createImage(String content, String imgPath,
   boolean needCompress) throws Exception {
  Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
  hints.put(EncodeHintType.MARGIN, 1);
  BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
    BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
  int width = bitMatrix.getWidth();
  int height = bitMatrix.getHeight();
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  for (int x = 0; x < width; x++) {
   for (int y = 0; y < height; y++) {
    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000
      : 0xFFFFFFFF);
   }
  }
  if (imgPath == null || "".equals(imgPath)) {
   return image;
  }
  // 插入图片
  QRCodeUtil.insertImage(image, imgPath, needCompress);
  return image;
 }

 /**
  * 插入LOGO
  *
  * @param source
  *   二维码图片
  * @param imgPath
  *   LOGO图片地址
  * @param needCompress
  *   是否压缩
  * @throws Exception
  */
 private static void insertImage(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();
 }

 /**
  * 生成二维码(内嵌LOGO)
  *
  * @param content
  *   内容
  * @param imgPath
  *   LOGO地址
  * @param destPath
  *   存放目录
  * @param needCompress
  *   是否压缩LOGO
  * @throws Exception
  */
 public static void encode(String content, String imgPath, String destPath,
   boolean needCompress) throws Exception {
  BufferedImage image = QRCodeUtil.createImage(content, imgPath,
    needCompress);
  mkdirs(destPath);
  String file = new Random().nextInt(99999999)+".jpg";
  ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
 }

 /**
  * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
  * @author lanyuan
  * Email: mmm333zzz520@163.com
  * @date 2013-12-11 上午10:16:36
  * @param destPath 存放目录
  */
 public static void mkdirs(String destPath) {
  File file =new File(destPath);
  //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
  if (!file.exists() && !file.isDirectory()) {
   file.mkdirs();
  }
 }

 /**
  * 生成二维码(内嵌LOGO)
  *
  * @param content
  *   内容
  * @param imgPath
  *   LOGO地址
  * @param destPath
  *   存储地址
  * @throws Exception
  */
 public static void encode(String content, String imgPath, String destPath)
   throws Exception {
  QRCodeUtil.encode(content, imgPath, destPath, false);
 }

 /**
  * 生成二维码
  *
  * @param content
  *   内容
  * @param destPath
  *   存储地址
  * @param needCompress
  *   是否压缩LOGO
  * @throws Exception
  */
 public static void encode(String content, String destPath,
   boolean needCompress) throws Exception {
  QRCodeUtil.encode(content, null, destPath, needCompress);
 }

 /**
  * 生成二维码
  *
  * @param content
  *   内容
  * @param destPath
  *   存储地址
  * @throws Exception
  */
 public static void encode(String content, String destPath) throws Exception {
  QRCodeUtil.encode(content, null, destPath, false);
 }

 /**
  * 生成二维码(内嵌LOGO)
  *
  * @param content
  *   内容
  * @param imgPath
  *   LOGO地址
  * @param output
  *   输出流
  * @param needCompress
  *   是否压缩LOGO
  * @throws Exception
  */
 public static void encode(String content, String imgPath,
   OutputStream output, boolean needCompress) throws Exception {
  BufferedImage image = QRCodeUtil.createImage(content, imgPath,
    needCompress);
  ImageIO.write(image, FORMAT_NAME, output);
 }

 /**
  * 生成二维码
  *
  * @param content
  *   内容
  * @param output
  *   输出流
  * @throws Exception
  */
 public static void encode(String content, OutputStream output)
   throws Exception {
  QRCodeUtil.encode(content, null, output, false);
 }

 /**
  * 解析二维码
  *
  * @param file
  *   二维码图片
  * @return
  * @throws Exception
  */
 public static String decode(File file) throws Exception {
  BufferedImage image;
  image = ImageIO.read(file);
  if (image == null) {
   return null;
  }
  BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(
    image);
  BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  Result result;
  Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
  hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
  result = new MultiFormatReader().decode(bitmap, hints);
  String resultStr = result.getText();
  return resultStr;
 }

 /**
  * 解析二维码
  *
  * @param path
  *   二维码图片地址
  * @return
  * @throws Exception
  */
 public static String decode(String path) throws Exception {
  return QRCodeUtil.decode(new File(path));
 }

 public static void main(String[] args) throws Exception {
  String text = "http://www.yihaomen.com";
  QRCodeUtil.encode(text, "c:/me.jpg", "c:/barcode", true);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java使用Google Zxing生成二维码的例子

    以前只用过jQuery.qrcode生成过二维码,这次使用的是Google的zxing通过Java代码生成二维码并以流的方式输出到前台页面 所需jar包:zxing-3.2.1.jar 代码 前台展示页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); S

  • Java中基于maven实现zxing二维码功能

    maven所需jar <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifac

  • java ZXing生成二维码及条码实例分享

    1.jar包:   ZXing-core-3.3.0.jar http://mvnrepository.com/artifact/com.google.zxing/core   ZXing-javase-3.3.0.jar   http://mvnrepository.com/artifact/com.google.zxing/javase BufferedImageLuminanceSource.java package com.webos.util; import java.awt.Grap

  • java中使用zxing批量生成二维码立牌

    使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址.文本等)生成二维码并放在该位置,最后加上立牌编号. 步骤: 1).做好背景图,如下图: 2).生成二维码BufferedImage对象.代码如下: /** * * @Title: toBufferedImage * @Description: 把文本转化成二维码图片对象 * @param text * 二维码内容 * @param width * 二维码高度 * @param height * 二位宽度 * @para

  • java二维码生成的方法

    本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下 这次用到的jar包是zxing,没有用到core的jar包 先导入zxing.jar包 生成二维码 package cn.huse.erweima; import java.io.File; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.go

  • java实现二维码生成的几个方法(推荐)

    java实现二维码生成的几个方法,具体如下: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourcefor

  • 利用Java生成带有文字的二维码

    介绍 主要使用了goole的zxing包,下面给出了示例代码,很方便大家的理解和学习,代码都属于初步框架,功能有了,需要根据实际使用情况完善优化. 第一步.maven导入zxing <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency>

  • Java生成二维码可添加logo和文字功能

    废话不多说,直接给大家贴代码了,具体代码如下所示: package com.luo.wctweb.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Date; imp

  • Java实现二维码功能的实例代码

    最近突然想写一些文章,所以就陆陆续续的编写一些自我感觉有用的并且大家也可能用到的一些技术代码.方便互相学习交流. 今天这篇文章,主要是利用Java实现二维码: 在写代码之前先讲一下整体思路,以方便更好更快捷的实现功能. (1).首先要想实现二维码功能需要导入com.google.zxing的核心jar包,我这里导入的是core-3.2.1.jar; (2).所谓二维码莫过于把需要的内容放入一张图片中,所以这里首先是创建一张带有参数内容的图片,方法如下: private static Buffer

  • java中ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android. 官网:ZXing github仓库 实战 本例演示如何在一个非 android 的 Java 项目中使用 ZXing 来生成.解析二维码图片. 安装 maven项目只需引入依赖: <dependency> <groupId>com.google.zxing

随机推荐