精华内容
下载资源
问答
  • C#代码生成二维码

    2017-08-20 10:19:29
    通过C#代码生成二维码,应用于C#开发使用到二维码的场景
  • vb纯代码生成二维码源代码,支持低中高容错生成
  • 如何用C代码生成二维码

    万次阅读 2016-10-16 20:48:00
    如何用C代码生成二维码 如何用C代码生成二维码  当下因微信和支付宝等手机应用广泛使用,而基于二维码/一维条码的移动支付,也借助手机移动端席卷全国,使得越来越多的人知道有“二维码”这么一种...

    如何用C代码生成二维码

    如何用C代码生成二维码

      当下因微信和支付宝等手机应用广泛使用,而基于二维码/一维条码的移动支付,也借助手机移动端席卷全国,使得越来越多的人知道有“二维码”这么一种东西。

      对于普通用户而来,一般只知道将自己的二维码展示给别人,别人使用软件识别这个二维码即可完成一定的功能。比如,扫码二维码付款、扫码二维码加微信好友、扫码二维码访问网页、扫码二维码下载app等等。这些个功能,在日常行为中,已经很常见了,但作为程序猿的我们,我们怎么能不知道二维码是如何生成的呢?或者说,我要自己生成一个二维码,除了去网页上找二维码生成工具来生成,我可以自己编码来实现么?

       答案,当然是,必须可以。不然这文章不用写了。

       在介绍如何用代码生成二维码之前,就不得不先介绍一个开源库叫zint。这个开源可谓牛叉的很,几乎平时见过的“码”,各式各样的一维条码、各式各样的二维码条码都难不倒它,重要的是,它还是开源的,几乎包含了所有常见“码”的生成。以下是摘自官方用户使用手册的介绍片段。(笔者上一篇博文介绍zint的安装时简单介绍了一下zint库,http://www.cnblogs.com/Recan/p/5967378.html ,它的开源项目网页为https://sourceforge.net/projects/zint/

    The Zint project aims to provide a complete cross-platform open source barcode generating solution. The package currently consists of a Qt based GUI, a command line executable and a library with an API to allow developers access to the capabilities of Zint. It is hoped that Zint provides a solution which is flexible enough for professional users while at the same time takes care of as much of the processing as possible to allow easy translation from input data to barcode image.

    -----------------------------------------------------华丽丽的分割线-----------------------------------------------------

      言归正传,说回如何使用zint库生成二维码。主要使用到以下几个函数:可以从zint.h中得到api的声明(主要是C语言的接口)。

    ZINT_EXTERN struct zint_symbol* ZBarcode_Create(void);

    ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol);

    ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol);

    ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);

      以下是个人封装的生成二维码的自定义接口函数:

    /****************************************************************************

    Descpribe: Create Qrcode API with C Code by calling zint lib.

    Input    : pQrCodeData, the qrcode data buf

                          QrcodeLen, the len of qrcode data, but it can be 0

                          pQrCodeFile, the output file name of qrcode, it can be NULL              

    Output   : pZintRet, to store the ret code from linzint.

    Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE

    Notes    : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.

    ****************************************************************************/

    ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet);

      这个接口定义比较简单,上面也简单说了各个参数的意义,其他中特别需要注意的是,如果传入生成二维码图片名字不使用默认值时(pQrCodeFile != NULL),也务必保证pQrCodeFile必须是以.png, .eps or .svg.结尾的文件名。

      以下是zint_code.c 和 zint_code.h的内容,里面将zint中生成二维码的几个函数封装在一块了,使用者只需关注上面定义的Zint_Create_QrCode函数,即可生成漂亮的二维码图片文件。

     1 /****************************************************************************
     2  * File       : zint_code.c
     3  * 
     4  * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
     5  * 
     6  * DESCRIPTION: Demo for creating qrcode by C code.
     7  * 
     8  * Modification history
     9  * --------------------------------------------------------------------------
    10  * Date         Version  Author       History
    11  * --------------------------------------------------------------------------
    12  * 2016-10-15   1.0.0    Li.Recan     written
    13  ***************************************************************************/
    14  
    15 // Standard Library
    16 #include <string.h>
    17 #include <stdio.h>
    18 
    19 // so Library
    20 #include "zint.h"
    21 
    22 // Project Header
    23 #include "zint_code.h"
    24 
    25 
    26 /****************************************************************************
    27 Descpribe: Create Qrcode API with C Code by calling zint lib.
    28 Input    : pQrCodeData, the qrcode data buf
    29            QrcodeLen, the len of qrcode data, but it can be 0
    30            pQrCodeFile, the output file name of qrcode, it can be NULL           
    31 Output   : pZintRet, to store the ret code from linzint. 
    32 Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
    33 Notes    : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
    34 ****************************************************************************/
    35 ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet)
    36 {
    37     struct zint_symbol *pMySymbol     = NULL;
    38     int RetCode                     = 0;    
    39     
    40     if(!pQrCodeData) //check input pointer
    41     {
    42         return ZINT_ERR_INV_DATA;
    43     }
    44 
    45     if(QrcodeLen == 0)
    46     {
    47         QrcodeLen = strlen((char *)pQrCodeData);
    48     }
    49     if(QrcodeLen > QRCODE_MAX_LEN)//len is too long
    50     {        
    51         return ZINT_ERR_TOO_LONG;
    52     }
    53 
    54     if(0 == ZBarcode_ValidID(BARCODE_QRCODE))
    55     {
    56         return ZINT_ERR_INV_CODE_ID;
    57     }
    58     
    59     pMySymbol = ZBarcode_Create();
    60     if(pMySymbol == NULL)
    61     {
    62         return ZINT_ERR_MEMORY;
    63     }
    64 
    65     if(pQrCodeFile)//when it's NULL, outfile will be "out.png"
    66     {
    67         if(strstr(pQrCodeFile, "png") || (strstr(pQrCodeFile, "eps")) || (strstr(pQrCodeFile, "svg")))
    68         {
    69             strcpy(pMySymbol->outfile, pQrCodeFile);
    70         }
    71         else
    72         {
    73             ZBarcode_Clear(pMySymbol);
    74             ZBarcode_Delete(pMySymbol); //release memory in zint lib
    75             return ZINT_ERR_FILE_NAME;
    76         }
    77     }
    78     pMySymbol->symbology     = BARCODE_QRCODE;  
    79     pMySymbol->option_1     = 3; //ECC Level.It can be large when ECC Level is larger.(value:1-4)  
    80     pMySymbol->scale         = 4; //contorl qrcode file size, default is 1, used to be 4   
    81     pMySymbol->border_width = 2; //set white space width around your qrcode and 0 is for nothing 
    82     
    83     RetCode = ZBarcode_Encode_and_Print(pMySymbol, pQrCodeData, QrcodeLen, 0);    
    84     ZBarcode_Clear(pMySymbol);
    85     ZBarcode_Delete(pMySymbol); //release memory in zint lib
    86 
    87     if(pZintRet)
    88     {
    89         *pZintRet = RetCode; //save ret code from zint lib
    90     }
    91     
    92     return ((0 == RetCode) ? (ZINT_OK) : (ZINT_ERR_LIB_RET));
    93 }
    View Code: zint_code.c
     1 /****************************************************************************
     2  * File       : zint_code.h
     3  * 
     4  * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
     5  * 
     6  * DESCRIPTION: API for creating qrcode by C code.
     7  * 
     8  * Modification history
     9  * --------------------------------------------------------------------------
    10  * Date         Version  Author       History
    11  * --------------------------------------------------------------------------
    12  * 2016-10-15   1.0.0    Li.Recan     written
    13  ***************************************************************************/
    14  
    15 #ifndef __ZINT_CODE__
    16 #define __ZINT_CODE__
    17 
    18 #ifdef __cplusplus
    19 extern "C"
    20 {
    21 #endif
    22 
    23 #include <stdint.h>
    24 
    25 #define QRCODE_MAX_LEN        500 //max string len for creating qrcode
    26 
    27 typedef enum 
    28 {
    29     ZINT_OK                 = 0,
    30     ZINT_ERR_INV_DATA         = -1, //input invalid data
    31     ZINT_ERR_TOO_LONG         = -2, //len for input data is too long    
    32     ZINT_ERR_INV_CODE_ID     = -3,//the code type is not supported by zint
    33     ZINT_ERR_MEMORY         = -4, //malloc memory error in zint lib
    34     ZINT_ERR_FILE_NAME        = -5, //qrcode file isn'y end in .png, .eps or .svg.
    35     ZINT_ERR_LIB_RET         = -6, //zint lib ret error, real ret code should be zint api ret code
    36 }ZINT_RET_CODE;
    37 
    38 /****************************************************************************
    39 Descpribe: Create Qrcode API with C Code by calling zint lib.
    40 Input    : pQrCodeData, the qrcode data buf
    41            QrcodeLen, the len of qrcode data, but it can be 0
    42            pQrCodeFile, the output file name of qrcode, it can be NULL           
    43 Output   : pZintRet, to store the ret code from linzint. 
    44 Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
    45 Notes    : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
    46 ****************************************************************************/
    47 ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet);
    48 
    49 #define Debuging(fmt, arg...)       printf("[%20s, %4d] "fmt, __FILE__, __LINE__, ##arg)
    50 
    51 #ifdef __cplusplus
    52 }
    53 #endif
    54 
    55 #endif /* __ZINT_CODE__ */
    View Code: zint_code.h

      在工程实践中,只需要将这两个文件添加到工程中,并让他们参与工程编译,即可完美使用zint生成二维码了。

      下面是一个简单的demo,将会展示如何使用这个接口函数,见qrcode_test.c

     1 /****************************************************************************
     2  * File       : qrcode_test.c
     3  * 
     4  * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
     5  * 
     6  * DESCRIPTION: Demo for creating qrcode by C code.
     7  * 
     8  * Modification history
     9  * --------------------------------------------------------------------------
    10  * Date         Version  Author       History
    11  * --------------------------------------------------------------------------
    12  * 2016-10-15   1.0.0    Li.Recan     written
    13  ***************************************************************************/
    14  
    15 // Standard Library
    16 #include <stdio.h>
    17 
    18 // Project Header
    19 #include "zint_code.h"
    20 
    21 int main(int argc, char *argv[])
    22 {
    23     int ZintLibRet             = 0; //ret code from zint lib
    24     ZINT_RET_CODE ZintRet     = 0; //ret code from zint_code api
    25     char QrcodeData[]         = "I love zint lib. 测试一下gbk编码 ...";
    26     char QrcodeDataDef[]     = "This's default qrcode file name : out.png ";
    27     char QrcodeFile[]         = "MyQrcode.png"; // Must end in .png, .eps or .svg. //zint lib ask !
    28     
    29     //test with inputing qrcode_file name
    30     ZintRet = Zint_Create_QrCode((uint8_t*)QrcodeData, 0, QrcodeFile, &ZintLibRet);
    31     if(ZINT_OK != ZintRet)
    32     {
    33         Debuging("Create qrcode err, ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    34     }
    35     else
    36     {
    37         Debuging("Create qrcode OK ! View qrcode file : %s in cur path. ZintRet = %d, ZintLibRet = %d\n", QrcodeFile, ZintRet, ZintLibRet);
    38     }
    39     
    40     //test without inputing qrcode_file name
    41     ZintRet = Zint_Create_QrCode((uint8_t*)QrcodeDataDef, 0, NULL, &ZintLibRet);
    42     if(ZINT_OK != ZintRet)
    43     {
    44         Debuging("Create qrcode err, ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    45     }
    46     else
    47     {
    48         Debuging("Create qrcode OK ! View qrcode file : out.png in cur path. ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    49     }
    50     
    51     return 0;
    52 }
    View Code: qrcode_test.c

      输入完成后,使用gcc -o qrcode_test qrcode_test.c zint_code.c –lzint 即可编译出qrcode_test的bin文件了。

      等等,如果你的linux还未安装zint库,sorry,你将看到

       

      那么赶紧回到上一篇博文 http://www.cnblogs.com/Recan/p/5967378.html 把zint安装起来吧。

      准确无误的编译,之后,在当前目录ls就可以看到qrcode_test的bin文件了。

      我们使用./ qrcode_test运行我们编译出来的demo程序,可以看到以下的提示:

    [liluchang@localhost src]$ ./qrcode_test

    ./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot

    open shared object file: No such file or directory

    又出什么问题了,原来系统在运行这个demo程序时,没有找到libzint.so来链接,那么我们只需要在运行之前告诉系统去哪里找这个so即可。使用

    export LD_LIBRARY_PATH=/usr/local/lib 这个路径是根据情况而定的。【注意这个export只对当前运行的shell生效,一旦切换一个shell,则需要重新输入。如果需要固定告诉运行demo的时候去哪里找so链接,则可以在编译的时候告诉它。这个点往后再介绍。】

    之后再运行demo程序:

     

    第一个框框里面是demo程序打印出来的调试信息,标识连个二维码都生成成功了。

    第二个框框可以看到,在当前目录下,就已经生成了这两个png文件,并且第二个生成的使用的是系统默认的名字out.png。

    为了验证程序生成的二维码是否正确,我们可以使用手机去扫码一下这两个二维码:

      

    为了验证程序生成的二维码是否正确,我们可以使用手机去扫码一下这两个二维码:

    用手机扫描出来的结果如下:

         

    图中显示的扫描结果,正好如demo中写的

     

    证明这代码是可行的。

     

    好了,本篇介绍使用C语言调用zint库生成二维码的教程就介绍到这里。感兴趣的童鞋可以评论留言或者自行阅读zint用户手册或开源项目介绍网页详细内容。

     

    后话,下篇文章将介绍zint库一维条码的生成,敬请期待。届时,zint_code.c的接口又丰富一些了。

     

    posted @ 2016-10-16 20:48 Mr.Recan 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • Java代码生成二维码

    2019-12-13 13:33:55
    前几天做了一个智能通行,要求我接收硬件生成卡号让我用Java代码生成二维码,在和硬件对接实现扫描开门 (1)大概流程就是 1、手机app发送请求给我后端, 2、我后端收到请求后,通过kafka消息列队在去请求硬件给我卡号 3...

    前几天做了一个智能通行,要求我接收硬件生成卡号让我用Java代码生成二维码,在和硬件对接实现扫描开门

    (1)要求流程

    1、手机app发送请求给我后端,
    2、我后端收到请求后,通过kafka消息列队在去请求硬件给我卡号
    3、硬件收到请求后生成卡号和有效时期再放回给我后端
    4、我后端在次接收硬件的请求后,把硬件生成的卡号生成二维码

    后续有俩种解决方案

    5、我在把二维码返回给前端App进行开门
    5、或者者把二维码保存到我的服务器,我发个短信给App用户,短信内容中有二维码链接,点击获取二维码进行开门

    最后选择了第二种解决方案

    (2)代码生成二维码源代码

    生成二维吗jar包(zxing)
    		<!-- 生成二维码依赖 -->
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>3.4.0</version>
            </dependency>
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>javase</artifactId>
                <version>3.4.0</version>
            </dependency>
    
    测试生成二维码源代码
    package com.lckj.api.card.util;
    
    import java.io.*;
    import java.nio.file.FileSystems;
    import java.nio.file.Path;
    import java.util.UUID;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    import org.springframework.stereotype.Service;
    
    @Service
    public class QRcodeUtil {
    
        /**
         * 生成发送二维码方法
         *
         * @param text     二维码生成规则(二维码可以是任何英文字母加数字生成的二维码)
         * @param width    宽度
         * @param height   高度
         * @param filePath 输出图片地址
         */
        public void getQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
            //生成二维码类
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            //生成的二维码
            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
            //生成图片唯一名称,加上.png格式
            String pat = getUUID() + ".png";
            //图片路劲加上图片名称  (输出地址)
            filePath += pat;
            Path path = FileSystems.getDefault().getPath(filePath);
            //输出二维码图片
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
        }
    
    
    	//运行测试
        public static void main(String[] args) {
            try {
                QRcodeUtil qRcodeUtil = new QRcodeUtil();
                
                //Xiaojie wants to eat eggs就是我们的生成规则,可随便填写
                qRcodeUtil.getQRCodeImage("Xiaojie wants to eat eggs", 350, 350, "C:\\Users\\Administrator\\Desktop\\");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 把String自带的UUID去除下划线返回
         *
         * @return String UUID
         */
        public String getUUID() {
            String s = UUID.randomUUID().toString();
            //去掉“-”符号
            return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24);
        }
    }
    
    桌面看效果

    在这里插入图片描述
    扫出来就是"Xiaojie wants to eat eggs"
    “Xiaojie wants to eat eggs” 就是我们自己定义的规则,在main方法中自己定义的
    qRcodeUtil.getQRCodeImage(“Xiaojie wants to eat eggs”, 350, 350, “C:\Users\Administrator\Desktop\”);
    如果后期要修改生成二维码的规则自己改参数就好了,我在getQRCodeImage()方法上有写参数

    (3)如何生成二维码保存到服务器,在通过短信链接让用户收到开门码怎么做

    修改二维码生成方法,添加手机号码参数

    package com.lckj.api.card.util;
    
    import java.io.*;
    import java.nio.file.FileSystems;
    import java.nio.file.Path;
    import java.util.UUID;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    import com.lckj.sms.ShortMessageManager;
    import org.springframework.stereotype.Service;
    
    @Service
    public class QRcodeUtil {
    
        //Linux保存二维码图片
        public String LINUX_QR_CODE_IMAGE_PATH = "/opt/uploadImage/savefiles/user/";
    
        //外网访问域名,自己服务器定义的
        public String LINUX_URL = "http://wy.xjycd.com/savefiles/user/";
    
        /**
         * 生成发送二维码方法
         *
         * @param text     二维码生成规则(二维码可以是任何英文字母加数字生成的二维码)
         * @param width    宽度
         * @param height   高度
         * @param filePath 输出图片地址
         * @param phone    手机号
         */
        public void getQRCodeImage(String text, int width, int height, String filePath, String phone) throws WriterException, IOException {
            //生成二维码类
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            //生成的二维码
            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
            //生成图片唯一名称,加上.png格式
            String pat = getUUID() + ".png";
            //图片路劲加上图片名称  (输出地址)
            filePath += pat;
            Path path = FileSystems.getDefault().getPath(filePath);
            //输出二维码图片
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    
            //发送短信接口,自己事先定义好的(如果要学习代码发送短信验证的话可以dd我)
            ShortMessageManager showDocumentMessage = new ShortMessageManager();
            //发送短信  参数:手机号,内容... 短信内容包括:外网访问服务器域名 + 上图片名称(实现外网访问二维码)
            showDocumentMessage.addSendCode(phone, LINUX_URL + pat);
        }
    
        /**
         * 把String自带的UUID去除下划线返回
         * @return String UUID
         */
        public String getUUID() {
            String s = UUID.randomUUID().toString();
            //去掉“-”符号
            return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24);
        }
    }
    

    调用端代码

    //生成二维码工具类 参数:生成规则,宽,高,生成保存地址,发送人手机号
    qRcodeUtil.getQRCodeImage(cardInfo.getCardNo(), 350, 350, qRcodeUtil.LINUX_QR_CODE_IMAGE_PATH, uservo.getMobilePhone());
    

    链接打开就是
    在这里插入图片描述
    建议不要使用阿里云的短信平台,因为想让阿里云的短信支持发送链接不太好弄,贼麻烦

    (4)如何把生成的二维码返回给前端输出

    直接把图片返回给前端的话,对不起,不行,需要转车base64才可以

    package com.lckj.api.card.util;
    
    import java.io.*;
    import java.util.Base64;
    import java.util.UUID;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    import org.springframework.stereotype.Service;
    
    @Service
    public class QRcodeUtil {
    
    
        /**
         * 生成发送二维码方法
         *
         * @param text   二维码生成规则(二维码可以是任何英文字母加数字生成的二维码)
         * @param width  宽度
         * @param height 高度
         */
        public String getQRCodeImage(String text, int width, int height) throws WriterException, IOException {
            //生成二维码类
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            //生成的二维码
            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
    
            //如果要把二维码在前台显示的话需要转成Base64
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", baos);
            byte[] bytes = baos.toByteArray();
            String encode = Base64.getEncoder().encodeToString(bytes);
            return encode;
        }
    
    
        public static void main(String[] args) {
            try {
                QRcodeUtil qRcodeUtil = new QRcodeUtil();
                String dd = qRcodeUtil.getQRCodeImage("Xiaojie wants to eat eggs", 350, 350);
                System.out.println(dd);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    
        /**
         * 把String自带的UUID去除下划线返回
         *
         * @return String UUID
         */
        public String getUUID() {
            String s = UUID.randomUUID().toString();
            //去掉“-”符号
            return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24);
        }
    }
    

    输出生成后是一串大概这样的字符串:

    iVBORw0KGgoAAAANSUhEUgAAAV4AAAFeAQAAAADlUEq3AAABYklEQVR42u3aUQ6DIAyAYRIP4JG4ukfyACTdoC3gMt0eS/L7YGR+PnVCW0zy/1ESGAwGg8FgcEB8JDvk2EX0qt61YweHx2N4VnduN3fBYXEN7V40yBb93a7Ai+H2/m76G3hB/H5XU5Y58OAl8BiWx7vgoHhKe8p0+pkjgYPgcTSS61tr5KlOAYfBdZX0Kfcd3iwe8+8vLDgc7r+1SNuViEypEDg0bgFt826NtLqsgb9ZYcHBsHZs+vLpd9sT4AVwKzg07fHJ1+oPrUTA0bGSWvRr9+30mI//ATg4nntu7TE92coJDo89u1Gaew/grtsDDoc9SdX+abIZ2J8FR8cf5b/OttcTODQeLTjNc86xkbGBl8CX7WBNgGzK3eR5Qx8cBJd5/3f6GqMlswJeCHvdqJW/3CSu4LBY2+C96Ld8CBwf+/AY3TePOXgFPLaD+yp5+PBhQx8cBfP9MxgMBoPB4AXxCz6/fN+Hq0IOAAAAAElFTkSuQmCC
    

    前端直接img标签输出也不行,需要在img标签的src属性中加上data:image/PNG;base64,
    例如:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>Img show</title>
    	</head>
    	<body>
    		<img height="350px" height="350px" src="data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAAFeAQAAAADlUEq3AAABYklEQVR42u3aUQ6DIAyAYRIP4JG4ukfyACTdoC3gMt0eS/L7YGR+PnVCW0zy/1ESGAwGg8FgcEB8JDvk2EX0qt61YweHx2N4VnduN3fBYXEN7V40yBb93a7Ai+H2/m76G3hB/H5XU5Y58OAl8BiWx7vgoHhKe8p0+pkjgYPgcTSS61tr5KlOAYfBdZX0Kfcd3iwe8+8vLDgc7r+1SNuViEypEDg0bgFt826NtLqsgb9ZYcHBsHZs+vLpd9sT4AVwKzg07fHJ1+oPrUTA0bGSWvRr9+30mI//ATg4nntu7TE92coJDo89u1Gaew/grtsDDoc9SdX+abIZ2J8FR8cf5b/OttcTODQeLTjNc86xkbGBl8CX7WBNgGzK3eR5Qx8cBJd5/3f6GqMlswJeCHvdqJW/3CSu4LBY2+C96Ld8CBwf+/AY3TePOXgFPLaD+yp5+PBhQx8cBfP9MxgMBoPB4AXxCz6/fN+Hq0IOAAAAAElFTkSuQmCC"/>
    	</body>
    </html>
    

    运行出来,完美
    在这里插入图片描述

    有可能您还需要:

    SpringBoot发送短信验证码:https://blog.csdn.net/weixin_43122090/article/details/103555621
    SpringBoot发送邮件https://blog.csdn.net/weixin_43122090/article/details/103560516
    如果需要邮箱发送二维码,可参考我Java发送邮件配合此篇文章可实现
    在这里插入图片描述

    展开全文
  • java代码生成二维码

    2017-09-22 16:07:00
    java代码生成二维码一般步骤 常用的是Google的Zxing来生成二维码,生成的一般步骤如下: 一、下载zxing-core的jar包: 二、需要创建一个MatrixToImageWriter类,此类google的源码中提供了,为了使用方便,...

    java代码生成二维码一般步骤

    常用的是Google的Zxing来生成二维码,生成的一般步骤如下:

    一、下载zxing-core的jar包:

     

    二、需要创建一个MatrixToImageWriter类,此类google的源码中提供了,为了使用方便,下面是类中的代码,可以直接复制来使用:

    	private static final int BLACK = 0xFF000000;
    	   private static final int WHITE = 0xFFFFFFFF;
    	 
    	   private MatrixToImageWriter() {}
    	 
    	   
    	   public static BufferedImage toBufferedImage(BitMatrix matrix) {
    	     int width = matrix.getWidth();
    	     int height = matrix.getHeight();
    	     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    	     for (int x = 0; x < width; x++) {
    	       for (int y = 0; y < height; y++) {
    	         image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
    	       }
    	     }
    	     return image;
    	   }
    	 
    	   
    	   public static void writeToFile(BitMatrix matrix, String format, File file)
    	       throws IOException {
    	     BufferedImage image = toBufferedImage(matrix);
    	     if (!ImageIO.write(image, format, file)) {
    	       throw new IOException("Could not write an image of format " + format + " to " + file);
    	     }
    	   }
    	 
    	   
    	   public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
    	       throws IOException {
    	     BufferedImage image = toBufferedImage(matrix);
    	     if (!ImageIO.write(image, format, stream)) {
    	       throw new IOException("Could not write an image of format " + format);
    	     }
    	   }
    

      三、创建一个启动类,用来生成二维码:(注意:二维码访问的url地址需要注意,如果书写成www格式的,需要浏览器扫一扫,同样的地址写成http格式的可以用任何扫码器扫都可以

    	
    	public static void main(String[] args) {
    		try {
                 //二维码访问的网址地址1:www.baidu.com或者http://baidu.com
    		     String content = "http://baidu.com";
    		     //二维码图片保存的路径
    		     String path = "D:/test";
    		     MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    		     Map hints = new HashMap();
    		     hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    		     BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 100, 100,hints);
    		     File file1 = new File(path,"百度首页.jpg");
    		     MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);
    		     
    		 } catch (Exception e) {
    		     e.printStackTrace();
    		 }
    	}
    

      四、经过亲自测试可以生成二维码,需要特别注意的是:

      二维码访问的url地址书写,一般情况下都是写成http格式的;

    转载于:https://www.cnblogs.com/lsy-blogs/p/7575417.html

    展开全文
  • java代码生成二维码以及解析二维码 1 package com.test; 2 3 import java.awt.Color; 4 import java.awt.Graphics2D; 5 import java.awt.image.BufferedImage; 6 import java.io.File; 7 import java.io....

    java代码生成二维码以及解析二维码

    复制代码
      1 package com.test;
      2 
      3 import java.awt.Color;
      4 import java.awt.Graphics2D;
      5 import java.awt.image.BufferedImage;
      6 import java.io.File;
      7 import java.io.IOException;
      8 
      9 import javax.imageio.ImageIO;
     10 
     11 import jp.sourceforge.qrcode.QRCodeDecoder;
     12 import jp.sourceforge.qrcode.exception.DecodingFailedException;
     13 
     14 import com.swetake.util.Qrcode;
     15 
     16 public class ErWeiMa {
     17 public static void main(String[] args) {
     18     qRCodeCommon("你好","jpg" , 7);
     19     System.out.println(decoderQRCode("d://ERWEIMA//test.jpg"));
     20 }
     21 /**
     22  * 生成二维码
     23  * @param content 存储的数据
     24  * @param imgType 图片类型
     25  * @param version 版本
     26  */
     27 private static void qRCodeCommon(String content, String imgType, int version) {  
     28     BufferedImage bufImg = null;  
     29     try {  
     30         Qrcode qrcodeHandler = new Qrcode();  
     31         // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小  
     32         qrcodeHandler.setQrcodeErrorCorrect('M');
     33         //设置编码模式 N 数字 ,A英文 ,B二进制
     34         qrcodeHandler.setQrcodeEncodeMode('B');  
     35         // 设置设置二维码版本,取值范围1-40,值越大版本越大,可存储的信息越大  
     36         //注意:设置太高生成的图片有可能扫不出来
     37         //1-40 共40个版本
     38         //1       21x21模块
     39         //40     177x177模块
     40         //每增加一个版本每边增加4个模块 ,如: 版本2 为25x25模块
     41         qrcodeHandler.setQrcodeVersion(version);  
     42         // 获得内容的字节数组,设置编码格式  
     43         byte[] contentBytes = content.getBytes("utf-8");  
     44         // 图片尺寸  
     45         //注意:尺寸不易过大,也不易过小
     46         int imgSize = 150;  
     47         bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);  
     48         Graphics2D gs = bufImg.createGraphics();  
     49         // 设置背景颜色  
     50         gs.setBackground(Color.WHITE);  
     51         gs.clearRect(0, 0, imgSize, imgSize);  
     52 
     53         // 设定图像颜色> BLACK  
     54         gs.setColor(Color.BLACK);  
     55         // 设置偏移量,不设置可能导致解析出错  
     56         int pixoff = 2;  
     57         // 输出内容> 二维码  
     58         if (contentBytes.length > 0 && contentBytes.length < 800) {  
     59             boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);  
     60             for (int i = 0; i < codeOut.length; i++) {  
     61                 for (int j = 0; j < codeOut.length; j++) {  
     62                     if (codeOut[j][i]) {  
     63                         gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);  
     64                     }  
     65                 }  
     66             }  
     67         } else {  
     68             throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");  
     69         }  
     70         gs.dispose();  
     71         bufImg.flush();
     72         
     73         File imgFile = new File("d://ERWEIMA//test.jpg");
     74         ImageIO.write(bufImg, imgType, imgFile);
     75     } catch (Exception e) {  
     76         e.printStackTrace();  
     77     }  
     78 }
     79 /**
     80  * 解析二维码中包含的内容
     81  * @param imgPath 二维码图片路径
     82  * @return
     83  */
     84 public static String decoderQRCode(String imgPath) {  
     85     // QRCode 二维码图片的文件  
     86     File imageFile = new File(imgPath);  
     87     BufferedImage bufImg = null;  
     88     String content = null;  
     89     try {  
     90         bufImg = ImageIO.read(imageFile);  
     91         QRCodeDecoder decoder = new QRCodeDecoder();  
     92         content = new String(decoder.decode(new CodeImage(bufImg)), "utf-8");   
     93     } catch (IOException e) {  
     94         System.out.println("Error: " + e.getMessage());  
     95         e.printStackTrace();  
     96     } catch (DecodingFailedException dfe) {  
     97         System.out.println("Error: " + dfe.getMessage());  
     98         dfe.printStackTrace();  
     99     }  
    100     return content;  
    101 } 
    102 }
    复制代码
    复制代码
     1 package com.test;
     2 
     3 import java.awt.image.BufferedImage;
     4 
     5 import jp.sourceforge.qrcode.data.QRCodeImage;
     6 
     7 
     8 public class CodeImage implements QRCodeImage{
     9      BufferedImage bufImg; 
    10      public CodeImage(BufferedImage bufImg){
    11          this.bufImg=bufImg;
    12      }
    13      @Override  
    14         public int getHeight() {  
    15             return bufImg.getHeight();  
    16         }  
    17       
    18         @Override  
    19         public int getPixel(int x, int y) {  
    20             return bufImg.getRGB(x, y);  
    21         }  
    22       
    23         @Override  
    24         public int getWidth() {  
    25             return bufImg.getWidth();  
    26         }  
    27       
    28 
    29 }
    复制代码

    关于解析的时候报错:Invalid number of Finder Pattern detected 是因为生成二维码的时候设置的图片长宽过大,而二维码只占了其中左上角一部分,导致解析出错。只需调整长宽即可。

    展开全文
  • Java代码生成二维码 照片 工具 eclipse JDK12 zxing3.2.1.jar 请看代码: 代码注释很清楚 package com.zhiyou.code; import java.io.File; import java.nio.file.Path; import java.util.HashMap; import ...
  • 生产企业或者物流快递需要用到大量的二维码和条形码,但是要自行编写代码批量生成二维码或者条形码并不容易,涉及的知识面很广。 Excel插件《E灵》提供了二维码接口和条形码接口,您只需要一句代码调用接口就可以...
  • 本资源使用两种方式生成二维码,一种不带logo,另一种带logo;项目里面已经添加了qrcode等二维码辅助包,不用再下载!直接通过集成工具运行即可
  • 用java代码生成二维码工具类 package com.quectel.automation.util; import com.google.zxing.*; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import ...
  • 使用java生成二维码图片 生成二维码步骤 1.可以去网上下载zxing的文件,然后自己生成一个jar包,也可以直接访问我上传的资源下载 https://download.csdn.net/download/weixin_42890953/10677219 2.创建一个java项目...
  • 完整的纯代码二维码生成代码,不需要加载相关的动态库或插件
  • php代码生成二维码

    2019-10-04 14:51:20
    生成二维码接口 12 $date ['qr']= $this ->getHttpimg( $url , $id ); 13 $id =M('alliance')->where('id='. $id )->setField( $date ); 14 $this ->success("推广联盟添加成功","/admin/alliance/index")...
  • 文章目录二维码的简介:第一种:QRCode.jar,使用QRCode生成和解析二维码生成二维码代码第二种:借助Google提供的ZXing Core工具包zxing3.3.1.jar 二维码的简介: java实现二维码的生成和解析:QRCode、zxing 两种方式 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,414
精华内容 1,765
关键字:

代码生成二维码