java实现生成二维码

Posted 夜空中最亮的星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现生成二维码相关的知识,希望对你有一定的参考价值。

                                                     java实现生成二维码

二维码vs条形码        

          最大的区别就是:二维码具有容错功能,当二维码图片被遮挡一部分后,仍可以扫描出来。容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,二维码内容还是可以被全部读到。

          二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力。容错率越高,则二维码图片能被遮挡的部分越多。

          二维码容错率用字母表示,容错能力等级分为:L、M、Q、H四级:

L       7%

M     15%

Q      25%

H     30%

      大多数情况下,我们强烈建议采用30%的容错率。对此我们做过各种型号手机的扫描测试。结果是:对目前主流手机,在绝大多数扫描场景下,容错率越高,越容易被快速扫描!!!

如果需要对二维码进行设计,比如需要在二维码中间加logo则需要选择H级容错率的二维码。当然,高容错率的代价是图片的复杂度提高。在实际操作中应该根据需求选择相应的容错级别。

注意,二维码边上的三个定位框和中间定位小块不能被遮挡。否则容错率再高也无法扫描。

所以超市当超市里面的商品上的条形码发生损坏事件时,是不能被扫描出来的,需要龚工作人员将条形码的号码输入电脑才可以计算价格。

 

实现二维码的思路:

           1.首先引入两个包,qrcode_a.rar和qrcode_b.rar两个包,这两个包中已经实现了创建二维码,计算二维码的许多方法,只需要应用过来用就可以了,非常方便。

       2.创建一个缓冲区图片;

       3.从缓冲区图片的基础上创建画笔;

       4.g.clearRect(0, 0, width, height);清空画面,准备画二维码;

       5.设置二维码最后实现的信息;

       6.将要实现的信息转化为字节数组;

       7.用boolean类型的二维数组存放二维码,如果是true则描黑,false则留白;   

          

代码实现:

 

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.UnsupportedEncodingException;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;

public class CreatQrCode {

    /*
     * 生成二维码
     */
    public static void main(String[] args) throws UnsupportedEncodingException {
        Qrcode qrcode=new Qrcode();
        //设置纠错等级
        qrcode.setQrcodeErrorCorrect(\'m\');
        qrcode.setQrcodeEncodeMode(\'B\');//N 数字 A a-z  B 中文,日文等等
        qrcode.setQrcodeVersion(10);//版本号1-40
        /*
         * GUI编程
         */
        //版本号与图片的长和宽是有联系的:这是一个固定的公式
        int width=67+12*(10-1);
        int height=67+12*(10-1);
        //设置偏移量,纠正二维码在解析时的错误
        int pianyiliang=2;
        //缓冲区图片
        BufferedImage buffimmage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //在缓冲区图片的基础上创造画笔
        Graphics2D g=buffimmage.createGraphics();
        g.setBackground(Color.WHITE);
        g.setColor(Color.BLACK);
        g.clearRect(0, 0, width, height);
        
        //开始画二维码
        /*
         * 设置二维码信息
         */
        String str="http://47.93.198.182";//这是一个程序员的表白网页
        
        //把字符串转化为字节数组
        byte[] bytes=str.getBytes("utf-8");
        if(bytes.length>0){
            //用boolean类型的二维数组存放二维码,如果是true则描黑,false则留白。qrcode.calQrcode(bytes);是计算二维码的信息的是方法
            boolean[][] bool=qrcode.calQrcode(bytes);
            //长和宽是一样的
            for(int i=0;i<bool.length;i++){
                for(int j=0;j<bool[i].length;j++){
                    if(bool[i][j]==true){
                        //画小方格
                        g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3);
                    }
                }
            }
        }
        g.dispose();
        buffimmage.flush();
        
    
            //ctrl 1:提示错误的快捷键
            try {
                ImageIO.write(buffimmage, "png", new File("d://a1.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    }
    
    
    
}

 

注意的事项:

1.二维码的版本号与图片的长和宽是有联系的,这里有一个固定的公式:67+12*(版本号-1);

2.在画小方格的时候,为了纠正二维码在解析时的错误,需要设置一定的额偏移量,g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3);

3.画完二维码之后,画笔和缓冲区图片都要进行释放。

 

运行结果:

 

          

以上是关于java实现生成二维码的主要内容,如果未能解决你的问题,请参考以下文章

java 生成二维码后如何给该二维码添加信息

java使用qcord生成的二维码,手机可以扫,扫描枪扫不出来,或者很难扫出来?

java zxing实现二维码生成和解析zxing实现二维码生成和解析

java实现二维码生成及调用打印机打印

java生成的二维码中间logo怎么改成文字

java 生产二维码报错