QR二维码编码解码系统
目录
1.需求
1.1总目标
1.2 QR二维码编码要求
1.3 QR二维码解码要求
1.4人机交互界面要求
2.项目分析
2.1 编码部分分析
3.实现
3.1生成BMP图片
3.2 精确选择每一个像素
3.3模块的填充
3.4纠错码的生成
3.5最终数据码
3.6数据码的填充
3.7掩码
4.开发环境
5.不足
6.附录
1.需求
1.1总目标
要求完成一套软件系统,该软件系统可以高效、安全地完成混合数据信息(即数据信息由英文字母、数字、二进制组成)的QR二维码的编码功能。
1.2 QR二维码编码要求
1.软件系统读取指定文件夹下面的文本文件数据信息内容,然后对数据信息进行QR二维码编码,生成QR二维码图片文件,并保存在指定文件夹下面。
2.每个文本文件中数据信息编码后对应一个QR二维码图片文件。指定文件夹下面最多1个文本文件,即编码后最多生成1个二维码图片文件。
3.生成的QR二维码图片为清晰的、黑白色BMP图片,保存的文件名生成规则为当前日期+时间+三位递增序列号,文件后缀名为bmp。例如2017年1月11日10点38分40秒时刻生成的序列号为5的图片文件,其对应文件名为:20170111103840005.bmp。
4.QR二维码编码时要求软件系统能够根据数据信息容量自动选择二维码的版本、码元数,要求纠错级别为H级别(30%的纠错能力)。
1.4人机交互界面要求
1.软件系统的人机交互界面可以是命令行形式。
2.人机交互界面至少需要提供以下功能:指定编码的输入文本夹、指定解码的输出文件夹、指定QR二维码图片文件文件夹。
3.人机交互界面需要提供查看编解码时的各种统计信息功能,包括统计编码的数据信息字节数统计、解码的数据信息字节数统计、编解码成功和失败次数、编解码成功率等。
2.项目分析
2.1 编码分析
要将文本进行二维码编码,最后的到一张BMP格式的二维码图片,首先要了解二维码的生成原理,可以参考ISO 18004号文件,该文件详细介绍了QR二维码的生成原理及标准。
既然要生成二维码,二维码的格式有许多固定的模块,最关键的数据部分可以生成数据后填充,所以首先要先能生成一张BMP格式图片,然后慢慢的往里面加不同的模块,最后填充数据部分,这样,就完成了编码生成二维码图片的部分。
考虑到只系统学习了C语言,所以软件系统采用C语言编写。
3.实现
3.1生成BMP图片
Windows系统规定了BMP图片的标准,查资料了解了BMP图片的文件结构,就可以很轻松的用C语言写出,可以在网上搜索,有很多例子。
3.2 精确选择每一个像素
由于我们需要将二维码的固定模块“画”出来,所以需要精确的选择到位图上的每一个像素。这时候就需要了解BMP文件结构的一个参数: biBitCount。
这个参数的单位是:比特数/像素 表示用几个比特表示单个像素的颜色。
由于用RGB标准来表示颜色比较简单,所以这里我们给参数赋值为32(注意一定要是32),这样可以用十六进制表示每一个像素的颜色。例如:0xff0000表示红色0x00ff00表示绿色,0x0000ff表示蓝色。
3.3模块的填充
利用矩阵的思想,将二维码固定的模块填充进BMP图片中,可以边填充边生成图片看一下是否准确。
3.4 原始数据码的生成
采用fopen函数读取文本文件,并保存到数组中,按照QR二维码标准将读取的数据一步一步的转化为二进制数据,标准中详细介绍了如何处理读取的数据。
3.4纠错码的生成
项目要求要有30%的纠错率,所以要根据纠错码算法利用前面生成的原始数据码生成对应的纠错码,主要用到了Reed-Solomon纠错算法,关于这点还没研究透(涉及许多高等数学知识),但按照步骤可以用算法实现纠错编码(解码还不会)。生成纠错码后要转化为二进制。
3.5最终数据码
将原始数据码和纠错码按照标准规定的格式顺序放在一个数组中就是最终的二进制数据码了。
3.6数据码的填充
有了存放数据码的数组,就可以填充进BMP图片了,我们这样实现数据的填充:
按照标准中规定的二维码数据填充顺序,对于第一个像素,判断对于的数据码是0还是1,是1,该像素就是黑色,0就是白色。这样,直到选择完所有的像素点。
这样我们就得到了一个还算完整的二维码,但这时生成的二维码是扫不出来的,也就是说不能被解码的,因为还少了最后一步。
3.7掩码
标准规定数据填充结束后要给数据区域加掩码,目的是防止出现大面积像素相同的情况,一共有八种掩码,为了方便,我们只采用了第一个掩码。第一个掩码的公式是(i+j)%2;
其中,i,j是单个像素的坐标,如果结果为0,就把当前模块的颜色改为相反颜色,白变黑,黑变白;如果结果不为0,就不改变。我们这样实现掩码:
一个一个的选择数据区域的每一个像素,然后判断结果是多少。
加了掩码之后,生成的是最终的二维码图片,此时,该图片就可以用二维码解码器将
数据识别出来了。
4.开发环境
编译运行:Dev C++
操作系统:Windows7
5.不足
一、在读取文件时没有实现选择文件夹就读取里面的文本文件,必须要选择到具体的文本文件。
二、数据填充的方式不够好,由于要一个个的选择每一个像素,而且每一个版本数据填充的方法虽然原理一样,但是并不通用,所以,一个版本就需要一个单独的数据填充和增加掩码的模块,这部分占源代码比重很大。
三、有一定几率出现乱码情况,应该是数据生成部分有问题,暂时还没找到。
四、代码还不够规范,看起来有些乱。
五、本来要做解码的,但是解码的原理没看懂。。。。。。。
因篇幅问题不能全部显示,请点此查看更多更全内容