zoukankan      html  css  js  c++  java
  • 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.画完二维码之后,画笔和缓冲区图片都要进行释放。

    运行结果:

              

  • 相关阅读:
    IE8及其以下浏览器边框圆角兼容问题
    关于git的一些指令及遇到的问题和解决方法
    vue项目环境搭建及运行
    webpack中的重要功能
    webpack 的重要功能
    c++ stl sort 自定义排序函数cmp要遵循 strict weak ordering
    spring boot 包jar运行
    windows上传文件到linux云服务器上
    最少硬币数目的问题
    leetcode 415 两个字符串相加
  • 原文地址:https://www.cnblogs.com/java-7/p/7214483.html
Copyright © 2011-2022 走看看