首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C/C+的角角落落 第二辑 006

使用第三方库制作二维码生成器

编程语言的更替只是让编程语言变得更加复杂和拥有全面的任务处理能力,但是语言在各方面的应用却不是编程语言标准的制定者考虑的。我们能使用MSVC本身制作的程序能做到的事情很少,我们常常需要使用第三方库来完成任务。

——关于图形库——

就MSVC而言,如果要显示图形,官方推荐的方法是建立WIN32程序,然后使用GDI技术来完成图形绘制,但是这样代码量会非常大,另外一些函数构造的不是非常好。比如我们可以在画图(我指的是mspaint.exe)程序中通过设置属性,十分方便的构造中空方框或填充方框,但是如果使用GDI实现,这两个实现的代码复杂度是完全不一样的,Windows没有在设计之初就像好为我们提供一些有较多参数的函数来统一化各类方框的绘制问题,因此本次我选择了第三方的绘图接口——EasyX库来在窗口上即时绘制二维码。

这里额外提一下关于MSVC6的源文件的原理,同时说明一下一般我们使用第三方库时,手动为MSVC6添加库的方法。MSVC6的安装路径里你可以找到这一些文件夹。

其中include文件夹存放了头文件和一些C基础函数的实现文件,Lib文件夹里面则存放了所有lib文件,静态链接库为你使用的函数或别的任何东西(比如状态机,对象)提供了实现代码。当你在网上下载到所需的第三方库文件之后,你需要把里面的头文件放到include文件夹内,静态链接库lib文件放到Lib文件夹里。这只是基本操作,省略了大量的细节内容。你需要知道MSVC6只支持32位的库,高版本的VS导入用于不同指令集的库都得放在不同的文件夹。另外一些库的lib文件可能需要你自己手动生成,库的提供者会给你原代码,你可以按照自己的情况(使用CMAKE)生成所需的lib文件。这次我们在MSVC6上添加的EasyX库的操作没有太多的问题。

我们百度EasyX,找到EasyX的官网,在上面下载EasyX库文件。

使用测试版本没有必要,而且最新版不提供库文件的压缩包而用安装包取而代之,因此我们果断选择2014冬至版,手工完成库添加的操作。

下载完成后,解压可以看到include和lib文件夹,我们就把include文件夹里的文件复制到MSVC6安装路径的include文件夹里,lib文件夹同样处理。但是lib文件夹里有另一个AMD64文件夹,那是为高版本支持x64指令集的VS准备的,对于MSVC6,我们只需要复制外面的4个lib文件就可以了。

——关于二维码生成——

Github上有大量的用C/C++写的二维码生成和识别工具或是库,但是它们基本上都是没有解释文档的,简单来说你拿到了大量原代码但是不知道如何去使用。你还是得去CSDN程序员博客上去找别人的劳动成果,幸运的是,有时你找得到这种东西(参考资料1)。

虽然下载下来的二维码数组生成函数源文件部分内容需要做修改,但是这一切是可行的。最终我的二维码生成器Demo版完成了。以下是VC++6给出的工程包含文件,其中外部依赖项(External Dependencies)内的第三方库头文件是IDE在你在代码中include graphic.h之后自动添加的。

最后我直接参照《参考资料1》中的内容把生成二维码的代码植入了我的小程序中。源文件QR_Encode.c(我在之后把后缀改成了cpp)中包含了通过字符串(url)生成表示二维码的二维数组的所有所需代码,并且所有生成代码都被包含在了函数BOOL EncodeData(char *lpsSource)中。植入只需要搞清楚该函数和该文件的包含项及操作方法就行了。声明在QR_Encode.h中的全局变量二维数组m_byModuleData将保存通过EncodeData操作之后得到的二维码数据。这个二维数组中保存的都是0x00、0x01字节值

(有点像单色BMP位图),0x00就代表二维码的空白点,0x01就代表二维码的黑点。最后只需要把这些空白点和黑点通过EasyX图形库显示出来,最终就会得到所需的二维码。以下是主程序代码。

我写了一个结构体然后搜了以下可填充矩形的生成方法,然后就大功告成了。

最后要说的是,二维码可以按需要生成不同大小的图案,这个大小可以通过修改MAX_MODULESIZE这个预先声明在QR_Encode.h中的宏来改变。具体二维码的生成方法请参看文末参考资料2。实际内容并没有看起来那么复杂,二维码实际上就是将一个字符串通过字符编码按照一定规律形成二位图形,并使用数据纠错码和掩码处理之后的图形。

以下是程序运行结果:

程序所有代码你可以通过官微菜单【往期专栏】-》【源码下载】,通过更新日期来搜索获取。如果你要使用这些代码请自行建立工程文件,并自行下载EasyX库并手动安装,最后自行将三个源文件添加到工程中。代码只是写到做测试的程度,我并没有添加输入url的功能,你可以自己添加功能代码。

推文写作,图文: 信息部 陈逸峰

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180317G1EBX500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券