二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字、图片、网址等信息的条码图片。如下图

二维码的特点:

1.  高密度编码,信息容量大

可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。

2.  编码范围广

该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。

3.  容错能力强,具有纠错功能

这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。

4.  译码可靠性高

它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。

5.  可引入加密措施

保密性、防伪性好。

6.  成本低,易制作,持久耐用

正因为以上这些特点,二维码现在越来越流行,应用也是越来越广(详细了解请见百度百科,介绍不是本篇重点),所以掌握如何开发二维码是非常不错的知识储备,因此本篇博文将为大家讲解如何生成、解析二维码。

一、Java

所需jar包:QRCode.jar

http://download.csdn.net/detail/wangpeng047/4008532

TwoDimensionCode类:二维码操作核心类

package qrcode;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);// 设定图像颜色> BLACKgs.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:/TDDOWNLOAD/Michael_QRCode.png";String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ sjsky007@gmail.com ]";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!!!");}
}

TwoDimensionCodeImage 类:二维码图片对象

package qrcode;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;}@Overridepublic int getHeight() {return bufImg.getHeight();}@Overridepublic int getPixel(int x, int y) {return bufImg.getRGB(x, y);}@Overridepublic int getWidth() {return bufImg.getWidth();}}

二、.NET

所需dll:ThoughtWorks.QRCode

http://download.csdn.net/detail/wangpeng047/4008536

这里代码思路跟上述java大同小异,这里就不给出源码了,可参见http://download.csdn.net/detail/ywjq/3454011

上面的java代码,笔者已经进行了简单的封装,方便大家适用不同场合,希望对大家能有所帮助。

二维码生成与解析代码实现相关推荐

  1. [转]java二维码生成与解析代码实现

    转载地址:点击打开链接 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大 ...

  2. java二维码生成与解析代码实现

    TwoDimensionCode类:二维码操作核心类 package qrcode;import java.awt.Color; import java.awt.Graphics2D; import ...

  3. C#的二维码生成和解析

    C#的二维码生成和解析 最近二维码非常流行,通过Goggles或快拍等二维码识别软件,可以节省不少输入时间.在网上搜了一下,发现还是有一些开源的C#程序生成解析二维码的. 生成:Open Source ...

  4. 矩形二维码生成,解析(彩色、多个)

    矩形二维码生成,解析(彩色.多个) 说明 java生成普通二维码.带logo二维码.彩色二维码 java解析彩色.多个二维码(一个图片上的多个二维码) 使用到的第三方jar包如下: com.googl ...

  5. Zxing实现二维码生成和解析,可带logo

        在项目中使用zxing生成二维码提供项目支撑(ZXing是一个开源Java类库用于解析多种格式的条形码和二维码),其余SwetakeQRCode.BarCode4j等等工具可去了解. 简单介绍 ...

  6. 二维码生成与解析(使用ThoughtWorks.QRCode)

    二维码生成 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEnco ...

  7. java 二维码生成和解析

    2019独角兽企业重金招聘Python工程师标准>>> <!-- 二维码 --><dependency><groupId>com.google.z ...

  8. Android 实现系统打印机打印图片,文本,以及二维码生成与解析

    打码机:扫码,生成打印自定义标签   一.Android 打印机要支持,网络.WiFi :手机与打印机在同一网络下才行,本文用WiFi连接 打开系统打印服务: 设置--更多设置--打印--选择默认打印 ...

  9. JavaScript:二维码生成与解析

    生成二维码 生成二维码使用qrcode库 安装 npm install qrcode -S 引入 import qrcode from 'qrcode' 调用方法生成二维码 qrcode.toStri ...

最新文章

  1. 2022-2028年中国木制拼板玩具市场调查研究报告
  2. 一个C#程序员学习微信小程序的笔记
  3. 链接h5代码_H5域名被微信拦截的原因及解决方案?
  4. 算法竞赛入门经典(第二版) | 例题5-1 大理石在哪 (普适查找)(UVa10474,Where is the Marble?)
  5. 2015年百度之星初赛(1) --- A 超级赛亚ACMer
  6. elementui图片上传php,vue+element-ui+富文本————图片上传
  7. (37)VHDL实现RS触发器
  8. 软件架构(5)---软件架构设计的一些总结和理解
  9. java中json对象去重复_如何忽略Java中JSON对象的多个属性?
  10. 数据解析(XML,JSON)
  11. matlab电力系统潮流计算软件matpower_衡真课堂 | 电力系统稳态与暂态分析
  12. 解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  13. .NET现成程序给你用[四]
  14. ubuntn安装qt5.12.10
  15. 小a的旅行计划(BM模板)
  16. 图层蒙版和快速蒙版、路径
  17. 手机mstsc远程工具_如何通过手机远程控制计算机
  18. Android开发【记事本App】项目开发流程——1
  19. switch基础用法
  20. win10实时防护彻底关掉

热门文章

  1. 为什么我们选择LambdaMART作为我们的酒店排序模型
  2. Java Web3j nonce 获取
  3. wordpress配置SSL证书
  4. 经典加密算法的实现与破解大素数生成算法
  5. js中有哪几种数据类型
  6. Nginx 反向代理https
  7. YMatrix 番外篇|透过镜头,那些不为人知的故事
  8. Linux下/etc/mdev.conf学习
  9. 联发科MT6893怎么样 联发科MT6893参数配置
  10. springboot+vue宠物医院诊所管理系统源码