`
HWL_SZ
  • 浏览: 53881 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二维码的原理及生成解析(JAVA)

    博客分类:
  • JAVA
阅读更多

二维条码/二维码(2D barcode) 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。最早起源于日本,原本是Denso Wave公司为了追踪汽车零部件而设计的一种条码

 

具体生成解析代码如下:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

 

public class QRCodeDecoderUtil
{
 
 /**
     * 生成二维码图片
     * @param content
     * @param imgPath
     */
    public static boolean encoderQRCode(String content, String imgPath)
    {
     Qrcode qrcodeHandler = new Qrcode();

     /**
      * 设置二维码纠错等级
      * L-默认:可以识别已损失的7%的数据
      * M-可以识别已损失15%的数据
      * Q-可以识别已损失25%的数据
      * H-可以识别已损失30%的数据
      * 纠错等级越高可存储的信息越少,但对二维码清晰度的要求越小
      */
        qrcodeHandler.setQrcodeErrorCorrect('M');

       
        qrcodeHandler.setQrcodeEncodeMode('B');

        // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
        int version = 6;
        qrcodeHandler.setQrcodeVersion(version);
       
        byte[] contentBytes = null;
        try
        {
         contentBytes = content.getBytes("gb2312");
        }
        catch(Exception ex)
        {
         ex.printStackTrace();
         return false;
        }
       
        BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);

        Graphics2D gs = bufImg.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.clearRect(0, 0, 140, 140);
       
        // 设置图像颜色
        gs.setColor(Color.BLACK);
       
        // 设置偏移量 避免解析出错
        int pixoff = 2;
       
        // 限制最字节数,与version有关
        int limit = 120;
       
        int len = null == contentBytes? 0:contentBytes.length;
        if (len > 0 && len < limit)
        {
            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
        {
            System.err.println("QRCode content bytes length = "
                    + contentBytes.length + " not in [ 0,"+limit+" ]. ");
            return false;
        }
       
        gs.dispose();
        bufImg.flush();

        File imgFile = new File(imgPath);
//        if (mkDir(imgFile))
//        {
         try
         {
    ImageIO.write(bufImg, "png", imgFile);
   }
         catch (IOException e)
         {
    e.printStackTrace();
    return false;
   }
//        }
        return true;
    }
   
//    private static boolean mkDir(File file)
//    {
//     if(file.getParentFile().exists())
//     {
//      return true;
//     }
//     else
//     {
//      if (mkDir(file.getParentFile()))
//     {
//      return file.mkdir();
//     }
//     else
//     {
//      return false;
//     }
//     }
//   }
   
   
    /**
     *
     * 解析二维码
     * @param imgPath
     *
     */
    public static String decoderQRCode(String imgPath)
    {
     File imageFile = new File(imgPath);
     BufferedImage bufImg = null;

        String decodedData = null;
        try
        {
            bufImg = ImageIO.read(imageFile);
            QRCodeDecoder decoder = new QRCodeDecoder();
            QRImage qrImage = new QRImage(bufImg);
            decodedData = new String(decoder.decode(qrImage));
        }
        catch (IOException e)
        {
            e.printStackTrace();

        }
        catch (DecodingFailedException ex)
        {
            ex.printStackTrace();
        }
        return decodedData;

    }


 /**
  * @param args
  */
 public static void main(String[] args)
 {
  String imgPath = "D:\\qrcode\\TEST.png";
  boolean result = QRCodeDecoderUtil.encoderQRCode("http://www.baidu.com", imgPath);
  
  if (result)
  {
   System.out.println(QRCodeDecoderUtil.decoderQRCode(imgPath));
  }
 }
}

class QRImage implements QRCodeImage
{
 BufferedImage bufImg;

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

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

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

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

 

分享到:
评论

相关推荐

    Java二维码生成/解析工具

    QRCodeUtils使用文档详见博客https://blog.csdn.net/qq_24091555/article/details/81263472

    关于Java的二维码的生成与解析

    `TestRead.java` 可能包含了使用特定库读取二维码的代码,而 `TestZXing.java` 可能是基于开源项目ZXing(Zebra Crossing)进行二维码生成的代码实现。 ZXing,或称“条形码扫描器”,是一个全面的、开源的、跨平台...

    Java实现的生成二维码和解析二维码URL操作示例

    Java 实现生成二维码和解析二维码 URL 操作示例 Java 是一种广泛使用的编程语言,具有强大的功能和灵活性。在实际应用中,生成二维码和解析二维码 URL 是非常常见的操作。本文将详细介绍 Java 实现生成二维码和解析...

    JAVA 生成二维码并设置失效机制

    1.通过QRCode.jar包生成二维码,可设置二维码图片格式,二维码图片存放路径,二维码尺寸,二维码颜色 2.二维码扫描内容分为两种,1种为链接式,如:www.zdkc.com,通过链接展示访问的内容,1种为json数据展示,通过...

    生成、解析带logo的二维码(java)

    在IT行业中,生成和解析二维码是一项常见的任务,特别是在移动应用、广告宣传以及数据交换等领域。本文将详细探讨如何使用Java语言来...在实践中,不断优化代码和用户体验,可以提高二维码生成和解析的效率和友好性。

    Java生成和解析二维码1.2(QRCode)

    本代码为二维码生成和解析的Java实现代码,包括三个类和一个QRCode的jar包(一个jar包用于生成二维码,一个jar包用于读取二维码尤其用于读取的jar包不好下载,所以就一起放进来了,方便大家学习使用),一个生成...

    基于java的二维码生成与解析demo

    这是一个基于java开发的二维码生成与解析 可以根据程序配置的参数设置生成二维码的图片大小 以及密度 这是一个基于java开发的二维码生成与解析 可以根据程序配置的参数设置生成二维码的图片大小 以及密度 这是一个...

    二维码生成以及扫一扫解析二维码原理实例

    总之,二维码生成与解析是Java后台开发中的实用技能,涉及到编码、图像处理、数据校验等多个技术领域。掌握这一技术,不仅可以增强应用的交互性,还能为用户提供更便捷的信息获取途径。通过深入理解二维码的原理和...

    java二维码生成及解析(内含QRCode所需jar包)

    Java二维码生成及解析是开发过程中常见的一项功能,尤其在移动互联网时代,二维码广泛应用于数据交换、链接跳转、支付凭证等方面。本资源包含用于生成和解析二维码的Java类以及必要的库文件。 首先,我们来了解一下...

    Java 二维码生成、解析

    Java 二维码生成与解析是Java开发中常见的功能需求,尤其在移动互联网时代,二维码被广泛应用于数据交换、链接跳转、支付凭证等场景。本文将详细介绍如何使用Google的ZXing库来实现Java环境下的二维码生成与解析。 ...

    二维码生成及解析源码

    2. **二维码生成** 要生成二维码,我们需要使用`MultiFormatWriter`和`BitMatrix`类。首先,将要编码的数据转换为`BarcodeFormat`对象,然后调用`encode`方法生成`BitMatrix`对象。接着,使用`BitmapEncoder`将其...

    Java程序批量生成二维码EPS、CSV、PDF矢量图和各种格式二维码

    最新功能支持导入码内容文件批量生成二维码,支持生成带中国二维码注册解析中心(IDcode)认证的二维码。 运行方式:1、在项目上右击 运行java程序,入口在com.fiwan.qrgenerator.GeneratorForm 2、打jar包 java -...

    Java QRCode二维码生成与识别 开源

    总的来说,这个Java QRCode二维码生成与识别开源项目提供了一整套解决方案,从生成包含汉字的二维码到读取和解析二维码图像。开发者可以利用这些工具进行各种应用开发,如移动支付、信息分享、门票验证等。通过深入...

    基于Spring Boot的二维码生成与解析接口.zip

    本项目是关于"基于Spring Boot的二维码生成与解析接口",将重点探讨如何在Spring Boot环境中实现二维码的生成与解码功能。 首先,二维码(Quick Response Code)是一种二维条形码,能够存储更多的数据,包括URL、...

    orCode 二维码的生成及解析

    3. **生成工具**:市面上有许多免费和付费的二维码生成工具,如草料二维码、在线二维码生成器等。这些工具通常提供简单的用户界面,只需要输入要编码的信息,选择相应的设置,即可生成二维码图片。 4. **自定义设计...

    二维码生成和解析

    二维码生成和解析是现代信息化技术中的重要组成部分,尤其在移动互联网和物联网领域中广泛应用。Java作为一门跨平台的编程语言,提供了丰富的库和工具来支持二维码的生成与解析。本篇将详细介绍如何在Java环境中实现...

    Android版二维码生成,和解析

    在`ecodeTest`这个项目中,你可以找到一个已经实现二维码生成和解析功能的示例,通过运行这个项目,你可以更好地理解和学习如何在Android应用中集成二维码功能。在实际开发中,记得根据项目需求进行适当的优化和调整...

    java生成二维码 二维码解析

    Java作为一种广泛应用的编程语言,提供了多种库和方法来生成和解析二维码。本篇文章将深入探讨如何使用Java进行二维码的生成与解析。 一、生成二维码 1. 引入库:在Java中,我们可以使用第三方库如Zxing(又名...

    二维码demo生成+解析+详细备注技术点步骤流程

    总结来说,二维码生成与解析是一个涉及编码、图像处理和解码等技术的过程。在实际应用中,开发者需要理解这些基本原理,并选择合适的工具或库来实现功能,同时关注兼容性、安全性和用户体验。通过深入理解这些技术点...

    android二维码的生成和解析

    总之,生成和解析二维码在Android应用开发中是一项实用技能,需要理解二维码的工作原理,选择合适的库,处理好图像和权限问题,并设计用户友好的交互。通过实践和理解这些知识点,开发者可以为用户提供高效、可靠的...

Global site tag (gtag.js) - Google Analytics