1、整体结构:arm板子+身份证+打印机
2、目标:识别是否有效证件并输出复印件
3、方案:身份证阅读使用sdk,获取的图片为bmp,用c开发,实现bmp图片叠加和文字叠加。使用lp命令输出打印
图片读取参考:http://www.cnblogs.com/tinaluo/p/8215602.html
4、问题:
4.1 bmp叠加图片是倾斜的,用了比较长的时间,应该和补齐有关,注意符合bmp格式。很多网上代码没有对对齐进行处理,不能应用于工程
4.2 字体叠加问题 freetype
安装:sudo apt-get install libfreetype6-dev
字体生成bmp:https://www.cnblogs.com/ynxf/p/6274067.html
http://www.xiaovdiy.cn/?post=320 可以参考,但是缺少变量定义
4.3 调用freetype编译测试提示ld fatal ,signal 11
猜测有可能是板子执行apt-get得到的库不匹配。
需要尝试编译源码(试过configure不过),再次尝试,下载方式:sudo apt-get source <代码名> ,如果提示sourcelist urixxx之类的错误,是因为需要配置源,参考这里https://blog.csdn.net/guo1988kui/article/details/79302340。
因为apt-get install 其他软件把gcc环境搞坏了,刷的系统
4.4 test.c:(.text+0x10): undefined reference to `FT_Init_FreeType'
这种是因为没有搜索到引用库,需要增加-L选项和 -l
gcc test.c -o test -I /usr/include/freetype2/ -L/usr/local/lib -lfreetype
4.5 汉字显示在bmp上为框
根本原因于编码,系统使用的是utf8编码,需要unicode编码,感谢 https://blog.csdn.net/bladeandmaster88/article/details/54837338
unicode和utf关系:https://www.cnblogs.com/myd620/p/8981569.html
4.6 图片文件base64后解码写入文件变短
分步骤查看各个函数输入输出,发现字节流中存在特殊字符00,导致截断,应该读取文件的时候使用读取的字节数作为数据量
4.7 bmp合并之后,出现图像复制问题
背景图像的深度不是24,是32导致,应该单行图像调试,比较容易发现问题
4.8 读取的图片和背景整合之后,头像尺寸小
身份证真实尺寸:尺寸为85.5X54 ,用尺子量一下获取的小头像大小和真实小头像大小比例以及和网上图片的对应关系,调整下背景图片尺寸
图像放大缩小:https://blog.csdn.net/weixinhum/article/details/38963705 代码
原理:https://www.cnblogs.com/zzw-in/p/Bilinear_interpolation.html
4.9 图片放大后发生水平偏移
源图片文件的读取偏移没有位于54字节处,使用fseek调整偏移位置(这里有个疑问,已经读取54字节,文件指针应该是在54字节位置,实际却没有到,待查)
4.10 打印的字符不清晰
放大底图的像素数,之后打印的字符会平滑
4.11 效率低
预读底图,尽量用内存操作替代文件操作,频繁的大文件修改,导致时间耗时增加很严重
4.12 开辟大数组出现segmentfalt
数组超过栈空间,参考:https://blog.csdn.net/educast/article/details/19768717
4.13 freetype字符不对齐问题
参考:https://blog.csdn.net/xiaohaizi77881314/article/details/13022457
其实是因为绘图的时候是从上到下进行的,没这样的话就会上端对齐,下端不对齐,方法是获取字体高度,控制Y方向的偏移,我这里用的是45-bitmap.rows
4.14 效率问题,程序执行3s,打印机在10s左右开始打印,应该是图片太大
思路1:图片bmp转换为jpg
apt-get installlibjpeg-dev ,经测试33M bmp 24位的图像jpeg库在arm上执行时间约为5s,时间太长,
思路2:图片降低位深,33M降低到11M,之后转换jpg
调整像素深度到8bit,转换速度提高到到1.2s左右,图片质量可接受,大小为200k
成果图: