java 二维码的生成与解析示例代码_java

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

二维码的特点:

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

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

2.  编码范围广

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

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

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

4.  译码可靠性高

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

5.  可引入加密措施

保密性、防伪性好。

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

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

 一、Java

所需jar包:QRCode.jar

http://sourceforge.jp/projects/qrcode/

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);

 // 设定图像颜色> 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:/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;
 }

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

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

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

}

 以上就是对java二维码生成与解析的资料整理,后续继续补充,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 二维码
, 二维码实现方法
java二维码生成
java二维码生成和解析、二维码生成解析、二维码解析与生成、java生成二维码、java二维码生成代码,以便于您获取更多的相关知识。

时间: 2024-12-10 20:47:13

java 二维码的生成与解析示例代码_java的相关文章

Android编程实现二维码的生成与解析_Android

本文实例讲述了Android编程实现二维码的生成与解析.分享给大家供大家参考,具体如下: 直接上代码,代码上面有具体的解析,并且提供jar供下载:二维码Jar包.rar . 根据文本生成对应的二维码: // 生成QR图 private void createImage() { try { // 需要引入core包 QRCodeWriter writer = new QRCodeWriter(); String text = qr_text.getText().toString(); Log.i(

Android编程实现二维码的生成与解析

本文实例讲述了Android编程实现二维码的生成与解析.分享给大家供大家参考,具体如下: 直接上代码,代码上面有具体的解析,并且提供jar供下载:二维码Jar包.rar . 根据文本生成对应的二维码: // 生成QR图 private void createImage() { try { // 需要引入core包 QRCodeWriter writer = new QRCodeWriter(); String text = qr_text.getText().toString(); Log.i(

Android 动态加载二维码视图生成快照的示例

1.需求背景 需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片). (常见这种情况是来源于"图片分享"的功能需求,与普通图片分享不同在于,该快照图片是动态加载不显示的.) 2.需求功能拆解 动态二维码的实现 动态视图生成快照的实现 3.踩坑点提要 获取不到动态视图的bitmap 无法获取最新动态视图的bitmap 4.开发实现 动态加载的视图的布局文件代码: <?xml version="1.0" en

Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)

首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码.生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧 首先我们需要一个这样的 Zxing 的包类似于这样 接下来需要引入资源 1.drawable 中引入图片 navbar.png 2.layout中引入camera.xml.main.xml.qrcode_capture_page.xml 3.创建raw文件夹并添加beep.ogg 扫描声音 4.合并color.xml,copy ids.

Java二维码登录流程实现代码(包含短地址生成,含部分代码)_java

近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿. 二维码原理 二维码是微信搞起来的,当年微信扫码二维码登录网页微信的时候,感觉很神奇,然而,我们了解了它的原理,也就没那么神奇了.二维码实际上就是通过黑白的点阵包含了一个url请求信息.端上扫码,请求url,做对应的操作. 一般性扫码操作的原理 微信登录.支付宝扫码支付都是这个原理: 1. 请求二维码 桌面端向服务

代码生成二维码-如何用java二维码生成

问题描述 如何用java二维码生成 我是新手,希望大神可以帮忙用java实现一下简单的二维码生成,可以扫除几行文本信息即可,不用实现其他特殊的功能. 解决方案 为了庆祝明天和这不成器的好产品,写上这Java生成的二维码!这里生成的二维码所使用的jar是为qrcode!具体资源的下载路径:http://download.csdn.net/download/luo201227/7130951(包含了代码和jar包),好啦.直接上代码: 一.[编码] import java.awt.Color; im

Android基于google Zxing实现二维码的生成_Android

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv

Java 二维码,QR码,J4L-QRCode 的资料整理_java

  开源码 Java 解码器 (编码解码)下载:http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip Java QR Code Open Source Decoder (只有编码)下载:http://www.java4less.com/qrcoded.zip J4L-QRCode 1.0 - Java component to create QR Code barcodes http://www.mayacode.com

Android基于google Zxing实现二维码的生成

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv