二维码的C语言实现

二维码在今天已经相当普及了,制作二维码也不难,网上有很多制作二维码的网站,输入信息,立即转换出二维码。然而我们要自己根据信息制作出二维码却不那么简单。网上粗略找了下源码,几乎清一色的是java/c#版本的,这对于stm32芯片项目来说没什么大帮助。最终辗转找到Linux上的qrencode软件包,将其移植了过来。

一、初识二维码

a)        二维码可以存储1850个字节的信息,可以存数字、字母、汉子、图像

b)        二维码三个矩形用于定位,矩形样式可以更改,整张图片甚至可以倒转过来

c)        拥有冗余信息,根据容错率可以选择最多50%

d)        因为冗余的关系,二维码中间以及右下角可以放置图案

f)         二维码的算法根据容错率的不同会产生不同的图案

草料二维码:你好

联图网二维码:你好

很显然两个网站的算法是不同的,但包含的信息都一样。用任意扫描端都能扫描出其中的内容

二、移植准备:

a) qrencode-3.4.4.tar.gz作为移植源码 百度盘:http://pan.baidu.com/s/1ntyvf7r

b) stm32f429i-discovery探索板

c) 移植好stemwin的例程 详见官方例程STM32Cube_FW_F4_V1.4.0目录下的\Projects\STM32F429I-Discovery\Applications\STemWin

三、移植过程

a)        用iar打开带stemwin的工程。 新建qrcode工程子目录,并将所有qrencode.tar.gz解压后的.c文件添加进来。

b)     在windows文件夹中打开此工程目录STM32Cube_FW_F4_V1.4.0\Projects\STM32F429I-Discovery\Applications\STemWin\qrcode

复制所有qrencode.tar.gz解压后的.c文件到src文件夹中

复制所有qrencode.tar.gz解压后的.h文件到inc文件夹中

c)        先保存编译一下。报了一大堆错,这是肯定的,源码包用的是linux的LCD库文件,解决方法是在这里将报错的都注释掉就可以了

在main函数中添加最重要的两句二维码库调用

Qrcode中就包含着我们最终需要的二维码信息,其实就是一个图,存着01比特信息

调用fb_qrdisp显示此二维码,这里贴出fb_qrdisp源码,注释掉的是已经修改的部分

<pre name="code" class="cpp">int Fb_QrDisp(int iPenX,int iPenY,QRcode*pQRcode)
{
         T_PixelDatasg_tOriginPixelDatas;
         T_PixelDatasg_tZoomPixelDatas;
         //intiZoom;
         inti;

         g_tOriginPixelDatas.iWidth= pQRcode->width;
         g_tOriginPixelDatas.iHeight=pQRcode->width;
         g_tOriginPixelDatas.iLineBytes=g_tOriginPixelDatas.iWidth;
         g_tOriginPixelDatas.aucPixelDatas= pQRcode->data;
/*
   if(pQRcode->version <= 1)
    {
                   iZoom= 2;
    }
         else
         {
                   iZoom= 2;

         }
   g_tZoomPixelDatas.iWidth = pQRcode->width*iZoom;
         g_tZoomPixelDatas.iHeight=pQRcode->width*iZoom;
         g_tZoomPixelDatas.iLineBytes=g_tZoomPixelDatas.iWidth;
         g_tZoomPixelDatas.aucPixelDatas= malloc(g_tZoomPixelDatas.iWidth*                                                         g_tZoomPixelDatas.iHeight);

         if(g_tZoomPixelDatas.aucPixelDatas== NULL)
         {
                   printf("g_tZoomPixelDatas->aucPixelDatasmalloc failed\n");
                   return-1;
         }

         PicZoom(&g_tOriginPixelDatas,&g_tZoomPixelDatas);
#if 0
         printf("g_tZoomPixelDatas.iWidth=%d,g_tZoomPixelDatas.iHeight=%d\n",               g_tZoomPixelDatas.iWidth,g_tZoomPixelDatas.iHeight);

for(i=0;i<(g_tZoomPixelDatas.iWidth*g_tZoomPixelDatas.iHeight);i++)
{
         printf("0x%x,",g_tZoomPixelDatas.aucPixelDatas[i]);
}
printf("\n");

#endif
*/
         Disp_FixelPic(iPenX,iPenY,&g_tZoomPixelDatas);
return 0;
}

因为stmf429运行起来后内存不够,这里不用申请内存再扩充放大二维码数据的方法,而是直接描点。所以这里注释掉了放大部分

e)        紧接着调用Disp_FixelPic根据qrcode进行描点

</pre><pre name="code" class="cpp"><pre name="code" class="cpp">void Disp_FixelPic(int iPenX,int iPenY,PT_PixelDatas ptPixelDatas)
{
    int i=0,j=0;
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();

        GUI_SetPenSize(1);

	for(i=0;i<ptPixelDatas->iHeight;i++)
	{
		for(j=0;j<ptPixelDatas->iWidth;j++)
		{
			if(ptPixelDatas->aucPixelDatas[i*ptPixelDatas->iHeight+j]&0x01)
			{
				//lcd_pixel_show(j+iPenX, i+iPenY,0x00);
                              GUI_SetColor(GUI_BLACK);
                              GUI_FillRect(j*8+iPenX, i*8+iPenY,j*8+8+iPenX, i*8+8+iPenY);

			}
			else
			{
                              GUI_SetColor(GUI_WHITE);
				//lcd_pixel_show(j+iPenX, i+iPenY, 0xffffff);
                              //GUI_DrawPoint(j*8+iPenX, i*8+iPenY);
                              GUI_FillRect(j*8+iPenX, i*8+iPenY,j*8+8+iPenX, i*8+8+iPenY);

			}
		}

	}
}

这里注释掉了原lcd描点函数,而是采用了stemwin提供的矩形填充函数

f)         编译运行,能看到LCD显示出二维码。至此移植完毕

移植过程中有一个小问题,因为调用了stemwin的画笔函数,当画笔GUI_SetPenSize(1);的时候,描的是一个点,当GUI_SetPenSize(16);的时候,画的是一个大圆点,而不是一个方点,这里要注意一下不能采用此画笔,而要采用矩形填充函数GUI_FillRect

void Disp_FixelPic(int iPenX,intiPenY,PT_PixelDatas ptPixelDatas)

{

int i=0,j=0;

GUI_SetBkColor(GUI_WHITE);

GUI_Clear();

GUI_SetPenSize(1);

for(i=0;i<ptPixelDatas->iHeight;i++)

{

for(j=0;j<ptPixelDatas->iWidth;j++)

{

if(ptPixelDatas->aucPixelDatas[i*ptPixelDatas->iHeight+j]&0x01)

{

//lcd_pixel_show(j+iPenX,i+iPenY,0x00);

GUI_SetColor(GUI_BLACK);

GUI_FillRect(j*8+iPenX, i*8+iPenY,j*8+8+iPenX, i*8+8+iPenY);

}

else

{

GUI_SetColor(GUI_WHITE);

//lcd_pixel_show(j+iPenX,i+iPenY, 0xffffff);

//GUI_DrawPoint(j*8+iPenX, i*8+iPenY);

GUI_FillRect(j*8+iPenX, i*8+iPenY,j*8+8+iPenX, i*8+8+iPenY);

}

}

}

}

时间: 2024-11-10 09:28:04

二维码的C语言实现的相关文章

在云平台上基于Go语言+Google图表API提供二维码生成应用

二维码能够说已经深深的融入了我们的生活其中.到处可见它的身影:但通常我们都是去扫二维码, 曾经我们分享给朋友一个网址直接把Url发过去,如今我们能够把自己的信息生成二维码再分享给他人. 这里就分享一下基于Go语言+Google图表API提供二维码生成功能的小应用,并演示怎样把它公布到云平台上, 让每一个人都能够通过网络訪问使用它. Google图表API Google在http://chart.apis.google.com 上提供了一个将表单数据自己主动转换为图表的服务. 只是,该服务非常难交

明明白白学通C语言(二维码版)

明明白白学通C语言(二维码版)清华大学出版社 全书共15章,分为3篇.第1篇为程序的基石--数据,介绍了C语言的概况及其处理的数据的种类,包括整型.实型和字符型等:第2篇为程序的本质--处理数据,介绍了C语言提供的处理数据的各种方法,包括运算符.表达式.语句及其结构等:第3篇为处理大量数据,介绍了C语言提供的对于大量数据的高级处理方法,包括数组.指针.结构和文件操作等. 本书是 一本与众不同的C语言图书,全书以全新的模式来分析和讲解C语言,以期带给读者不同的编程学习体验.本书创造性地将智能手机巧

java、python、golang等开发语言如何快速生成二维码?

免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来,我就说说如何快速的.高质量的生成一个可高度定制的二维码. 二维码的编码算法是公开的,这就意味着大部分的开发语言都可以动图生成.但是在二维码应用如此广泛的今天,还自己去造轮子,如果不是傻,那就是正真的技术极客了. Java有开源的二维码生成库:com.google.zxing,这是谷歌大佬为andro

java二维码生成

二维码,是一种采用黑白相间的平面几何图形经过相应的编码算法来记载文字.图画.网址等信息的条码图画.如下图 二维码的特色: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比一般条码信息容量约高几十倍. 2.  编码规模广 该条码能够把图画.声响.文字.签字.指纹等能够数字化的信息进行编码,用条码表明出来:能够表明多种语言文字:可表明图画数据. 3.  容错能力强,具有纠错功用 这使得二维条码因穿孔.污损等导致部分损坏时,照样能够正确

使用libqrencode库制作二维码电子名片--IOS版

1.效果图: 点击生成按钮,显示二维码: 使用微信扫一扫后,获得如下界面: 2.libqrencode库: libqrencode是一个日本人(Kentaro Fukuchi)写的生成二维码的跨平台c语言库.官网是这里,Github在这里.本人最喜欢的就是这种[用c写成的.跨平台的.功能单一的.使用方便的]库!IOS中Objc使用C/C++库超方便,android下,稍微麻烦一点. 3.Objc对libqrencode包装: 网上找的QRCodeGenerator类,由Andrew Kopane

Qt+QZXing编写识别二维码的程序

本人最近在用Qt编写程序,需要用编写二维码识别功能.在网上搜寻一番,找到了QZXing.配置过程中确实出了一大把汗,这里我写这篇文章记录配置方法,替后人省一把汗吧!我的开发环境:MSVC2010 + Qt5 从这里下载最新版的QZXing_sourceV2.3.zip,解压之后得到的是源代码,里面有一个QZXing.pri文件.理论上用MSVC加载这个pri文件之后这个库的代码就会出现在工程的代码列表中,但是理论归理论,实际上msvc在加载pri的过程中,弹出一大堆错误信息,完全不知所云,网上找

【转】Android 二维码 生成和识别(附Demo源码)--不错

原文网址:http://www.cnblogs.com/mythou/p/3280023.html 今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲解如何使用ZXing库,生成和识别二维码.这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码. 1.ZXing库介绍 这里简单介绍一下ZXing库.ZXin

二维码生成delphi版

二维码生成delphi版 生成二维码的软件,代码从C语言转换过来(源地址:http://fukuchi.org/works/qrencode/),断断续续的差不多花了一周时间来转换和调试.在转换过程中学到了不少东西,特别是对于delphi和C语言中一些概念比较模糊的地方,有了更清楚地认识. 支持中英文文字生成二维码,在手机上使用快拍和微信扫描后显示正常,无乱码.在delphi 7 / delphi 2010 / delphi XE5上调试通过.qrencode的源代码为C语言,支持生成png格式

通讯录二维码使英文变为中文

1:添加中文设置 2:iOS语言设置为中文 通讯录二维码使英文变为中文,布布扣,bubuko.com