当前位置: 首页 > news >正文

Java代码生成二维码图片


需要使用到的jar包:QRCode.jar 下边是一个链接如果链接失效请百度下载。

这里提供一个下载: 点此下载QRCode.jar 

package com.lc.test;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
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 = "G:/ZTFCard.png";
           String encoderContent = "我的名片" + "\n我的微博:[http://blog.csdn.net/xlgen157387]" + "\n电子邮件:[1573876303@qq.com]" +"\n手机:[1808462274]" ;
           TwoDimensionCode handler = new TwoDimensionCode();
           handler.encoderQRCode(encoderContent, imgPath, "png" );
//         try {
//              OutputStream output = new FileOutputStream(imgPath);
//              handler.encoderQRCode(content, 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!!!" );
     }
}

package com.lc.test;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class TwoDimensionCodeImage implements QRCodeImage {

	BufferedImage bufImg;

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

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

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

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


下面是一个测试的类:QRtest.java

public class QRtest {
    public static void main(String[] args){
        TwoDimensionCode td = new TwoDimensionCode();
        td.encoderQRCode("这是一个测试文件类","d://123.jpg","jpg",12);
    }
}


(注意:有的朋友可能在使用代码的时候,无法导入javax.imageio.ImageIO这个包,请参考这个:点击打开链接
 

解决方案是:Project---Properties,选择Java Build Path,选中右侧的Libraries,选择Add Library如下图,选中JRE System Library 选择next,进入下一界面选择Execution environment,点击Enviroments按钮选择你采用的JDK如JavaSE-1.6等,不要选下面的OSGi,最后单击完成即可。




结果如下:


OK!



相关文章:

  • 2.Cocos2dx 3.2重力系统Box2D
  • Ubuntu下安装C/C++开发环境【!!!有更新!!!Ubuntu14.10下使用eclipse搭建C语言开发环境】
  • 翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)...
  • Spring的核心机制:依赖注入
  • Spring获取ApplicationContext对象工具类
  • linux基础学习8
  • Ubuntu系统更新命令笔记
  • 大龄屌丝自学笔记--Java零基础到菜鸟--038
  • VMWare虚拟机提示:锁定文件失败,打不开磁盘的解决办法
  • HDU2030 汉字统计
  • Windows下删除不需要的服务
  • [原创] SQLite数据库使用清单(下)
  • Oracle11g安装详细步骤【有图在里边哦】
  • Myeclipse链接Oracle等数据库时lo exception: The Network Adapter could not establish the connection
  • taglib的使用
  • 《Java编程思想》读书笔记-对象导论
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • java2019面试题北京
  • js算法-归并排序(merge_sort)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • ReactNativeweexDeviceOne对比
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 来,膜拜下android roadmap,强大的执行力
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • nb
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #include<初见C语言之指针(5)>
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #每日一题合集#牛客JZ23-JZ33
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.9) MSP (version 4.2)
  • (1)Nginx简介和安装教程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原)Matlab的svmtrain和svmclassify
  • . NET自动找可写目录
  • .apk文件,IIS不支持下载解决
  • .NET 读取 JSON格式的数据
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net中的设计模式——Factory Method模式
  • .net专家(高海东的专栏)
  • /etc/fstab 只读无法修改的解决办法
  • :中兴通讯为何成功
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @angular/cli项目构建--Dynamic.Form
  • @RequestMapping-占位符映射