【C语言应用】如何用C代码生成二维码?

【C语言应用】如何用C代码生成二维码?如何用C代码生成二维码?

大家好,又见面了,我是你们的朋友全栈君。

如何用C代码生成二维码

如何用C代码生成二维码

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

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

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

   在介绍如何用代码生成二维码之前,就不得不先介绍一个开源库叫zint。这个开源可谓牛叉的很,几乎平时见过的“码”,各式各样的一维条码、各式各样的二维码条码都难不倒它,重要的是,它还是开源的,几乎包含了所有常见“码”的生成。以下是摘自官方用户使用手册的介绍片段。(笔者上一篇博文介绍zint的安装时简单介绍了一下zint库,如何在linux平台安装zint开源库 – 架构师李肯 – 博客园 ,它的开源项目网页为Zint Barcode Generator download | SourceForge.net

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函数,即可生成漂亮的二维码图片文件。

【C语言应用】如何用C代码生成二维码?

【C语言应用】如何用C代码生成二维码?

 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

【C语言应用】如何用C代码生成二维码?

【C语言应用】如何用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

【C语言应用】如何用C代码生成二维码?

【C语言应用】如何用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,你将看到

   

【C语言应用】如何用C代码生成二维码?

  那么赶紧回到上一篇博文 如何在linux平台安装zint开源库 – 架构师李肯 – 博客园 把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程序:

【C语言应用】如何用C代码生成二维码?

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

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

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

  

【C语言应用】如何用C代码生成二维码?

【C语言应用】如何用C代码生成二维码?

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

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

【C语言应用】如何用C代码生成二维码?

    

【C语言应用】如何用C代码生成二维码?

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

【C语言应用】如何用C代码生成二维码?

证明这代码是可行的。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143483.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 网络文件服务器_文件存储服务器

    网络文件服务器_文件存储服务器网络文件服务器:通过网络共享文件或文件夹,实现数据共享NAS(networkappendstorage)共享的是文件夹1.FTP文件服务器2.samba不同系统间的文件夹或设备共享不用系统

  • 【C 语言】文件操作 ( fopen 文件打开方式详解 )「建议收藏」

    【C 语言】文件操作 ( fopen 文件打开方式详解 )「建议收藏」r:只读方式打开文件,文件必须存在;文件不存在打开失败;+:读写方式打开文件;w:打开只写文件,文件不存在创建文件,文件存在覆盖文件;a:打开只写文件,文件不存在创建文件,文件存在追加文件;

  • 测试用例八大要素以及设计方法

    测试用例八大要素以及设计方法测试用例(TestCase)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求测试用例八大要素1.测试用例编号由字母、字符、数字组合而成的字符串,有唯一性,易识别性。eg:1)系统测试:产品编号-ST-系统测试项名-系统测试子项名-编号2)集成测试:产品编号

  • UpdatePanel的简单用法(非嵌套)「建议收藏」

    UpdatePanel的简单用法(非嵌套)「建议收藏」ScriptManager和UpdatePanel控件联合使用可以实现页面局部异步刷新的效果。UpdatePanel用来设置页面中局部异步刷新的区域,它必须依赖于ScriptManager,因为ScriptManager控件提供了客户端脚本生成与管理UpdatePanel的功能。

  • linux修改用户名命令6,linux用命令改用户名

    linux修改用户名命令6,linux用命令改用户名怎样更改linux的用户名Linux中可以使用usermod命令更改用户名,具体的操作方法如下:首先打开linux的终端,输入指令修改用户名,简单的用户名修改是usermod加参数l,后面跟新用户名,最后是旧用户名。此时用cd命令来到home目录,会发现存在一点小问题。linux下命令怎么修改用户名先用终端进入到根目录下的root文件夹然后su权限不用我说了吧然后用下面这个命令:usermo…

  • Linux内存管理机制_linux ntp同步命令

    Linux内存管理机制_linux ntp同步命令Linux中的线程同步机制(一)–Futex引子在编译2.6内核的时候,你会在编译选项中看到[*]Enablefutexsupport这一项,上网查,有的资料会告诉你”不选这个内核不一定能正确的运行使用glibc的程序”,那futex是什么?和glibc又有什么关系呢?1.什么是FutexFutex是FastUserspacemuTexes的缩写,由Hu

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号