java实现生成二维码

                                                     java实现生成二维码java

二维码vs条形码        程序员

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

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

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

L       7%编码

M     15%spa

Q      25%设计

H     30%code

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

若是须要对二维码进行设计,好比须要在二维码中间加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.画完二维码以后,画笔和缓冲区图片都要进行释放。

 

运行结果:

相关文章
相关标签/搜索