C语言实现生成二维码的单色位图
硬件环境: Arm 移植过二维码的库qrencode
本文主要是实现一种单色位图的二维码的生成,前期需要自己移植二维码的库,下面就是具体的生成代码,主要流程就是将二维码库函数生成的数据放到自己已经构建好的单色位图中
void MakeQrencode(const char *QRTEXT){ QRcode * qrCode;int version = 10; //设置版本号,这里设为10,对应尺寸:57*57QRecLevel level = QR_ECLEVEL_H; //纠错码为高(当二维码有点破损时也能扫的出来)QRencodeMode hint = QR_MODE_8; //数据编码形式 -> 字节编码int casesensitive = 1;int count;char buff[20];qrCode = QRcode_encodeString("hello world", version, level, hint, casesensitive); //调用库函数生成二维码if (NULL == qrCode){printf("QRcode create fail\n");}snprintf(buff,20,"%s",QR_CODE_FILE); //即将生成的二维码图片 #define QR_CODE_FILE "./qrcode.bmp" FILE * pf = fopen(buff, "w+"); //创建图片if (NULL == pf){printf("file open fail.\n");fclose(pf);}int width = qrCode->width;int height = qrCode->width;int biCount = 1; //单色位图int iexwidth = width;if(width % 8){iexwidth += 8;}iexwidth /= 8;int lineByte = (iexwidth + 3) & ~0x03; //计算每行的字节数,必须是4的倍数//位图文件头BITMAPFILEHEADER bitMapFileHeader;bitMapFileHeader.bfType = 0x4D42; //图片类型bitMapFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) + lineByte * height; //图片大小 单位:bytebitMapFileHeader.bfReserved1 = 0; bitMapFileHeader.bfReserved2 = 0; bitMapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD); //距离颜色数据指针的偏移量//位图信息头BITMAPINFOHEADER bitMapInfoHeader;bitMapInfoHeader.biSize = 40; //位图信息头大小bitMapInfoHeader.biWidth = width; //图片宽度 单色位图一个像素一位bitMapInfoHeader.biHeight = height; //图片高度bitMapInfoHeader.biPlanes = 1; bitMapInfoHeader.biBitCount = biCount; //图片深度bitMapInfoHeader.biCompression = 0; bitMapInfoHeader.biSizeImage = lineByte * height; //图片颜色数据大小bitMapInfoHeader.biXPelsPerMeter = 0; bitMapInfoHeader.biYPelsPerMeter = 0; bitMapInfoHeader.biClrUsed = 0; bitMapInfoHeader.biClrImportant = 0; //颜色表 单色位图两个调色板RGBQUAD bitMapRGBQuad1,bitMapRGBQuad2 ; bitMapRGBQuad2.rgbBlue = 0xff;bitMapRGBQuad2.rgbGreen = 0xff;bitMapRGBQuad2.rgbRed = 0xff;bitMapRGBQuad2.rgbReserved = 0;memset(&bitMapRGBQuad1,0,sizeof(bitMapRGBQuad2));//写文件头进文件fwrite(&bitMapFileHeader, sizeof(BITMAPFILEHEADER), 1, pf);//写位图信息头进文件fwrite(&bitMapInfoHeader, sizeof(BITMAPINFOHEADER), 1, pf);//写颜色表进文件fwrite(&bitMapRGBQuad1, sizeof(RGBQUAD), 1, pf);fwrite(&bitMapRGBQuad2, sizeof(RGBQUAD), 1, pf);unsigned char * pBMPData = (unsigned char *)malloc(lineByte * height); //生成颜色数据的指针memset(pBMPData, 0, lineByte * height); //首先数据全部清0,就是纯黑unsigned char * qrData = qrCode->data;int ibit;int ibyte;int i,j;int k = 0;for (i=0; i < height; i++){for( j = 0; j < width; j++){ibit = j % 8;ibyte = j / 8;if((*(qrData) & 1) == 0 ){ //二维码数据是字节格式,最后一位是颜色值,当最后一位为0,就是白色 *(pBMPData + lineByte * i + ibyte) |= ((unsigned char)(0x80 >> ibit)); //颜色指针对应位置1 普通图 0是黑 1是白}qrData++;} }//写数据进文件count = fwrite(pBMPData, sizeof(unsigned char), lineByte * height, pf);fclose(pf);free(pBMPData);pBMPData = NULL;printf("write_info:%s,count=%d,lineByte=%d,lineByte * height=%d,height=%d,width=%d\n",QRTEXT,count,lineByte,lineByte * height,height,width);QRcode_free(qrCode);}
生成的二维码图片:
C语言实现生成二维码的单色位图相关推荐
- java语言批量生成二维码
背景: 在智物项目中,为了物品入库.借用.归还方便,减少用户的操作,使用扫描二维码的方式进行操作,那么如何java 后端生成二维码传入到前端就成了一个问题 业务分析: 1.寻找一个二维码的pfd文件类 ...
- C语言使用QRcode生成二维码
C语言使用QRcode生成二维码的简单操作 首先需要QRcode源码包 可以参考这位大神的文章: https://blog.csdn.net/qq_21475601/article/details/7 ...
- C语言 生成二维码-嵌入式平台
概述 全程C语言实现,二维码. IDE:Visual Studio 2022 一.code 1).data_type.h #ifndef __DATA_TYPE_H__ #define __DATA_ ...
- 单片机生成二维码 C语言代码
随着二维码支付的普及,现在对设备端生成二维码的要求越来越多,前些时间做了一些项目,刚好是要在单片机接12864LCD屏生成二维码. 单片机生成二维码的源码,C语言编写,封装成函数,简单易用.本程序需要 ...
- C语言文件操作 文件已经存在则清空,不存在则新建文件 生成二维码图片
文件已经存在则清空,不存在则新建文件 fp = fopen(DEF_QRCODE_TEXT_1, "wb+");fclose(fp); 文件大小及读文件 int iFileSize ...
- java零碎要点---用java实现生成二维码,与解析代码实现
创梦综合技术qq交流群:CreDream:251572072 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1. 高密度编 ...
- liunx+python+django框架实现图片生成二维码
点击箭头处"蓝色字",免费领测试技术及面试资料! 余生皆欢喜 liunx+python+django框架实现二维码生成器 首先我简单的介绍下django:django官网解释就是如 ...
- 51单片机生成二维码
最近搞了个单片机生成二维码,步骤如下 1.下载QRCode生成的驱动源代码,这个驱动是c语言编写的可以移植到各种c语言写的工程上去,下面附上下载链接: https://download.csdn.ne ...
- jenkins 下自动构建 生成二维码(不使用蒲公英 fir)
最近蒲公英每个版本只能下载10次了. 我感觉未来免费的东西会越来越不好,所以准备利用Tengine或者tomcat搭建自己 的下载平台. 先说下如何实现吧: 首先jenkins自动打包apk后, 把a ...
最新文章
- 数学之美:“植物身上的黄金分割”
- linux 查询线程是否结束_批量随机键值查询测试
- CentOS中安装MySQL数据库
- PHP基础知识(三)
- 【NLP】利用jieba对网易云音乐的评论进行词云分析
- 中石油oj 2654: 序列合并
- iview 使用笔记
- Python基础案例练习:掷骰子小游戏
- Seven Kinds of Testers - 七种类型的测试
- 并集、交集、差集、补集的概念是什么?
- Python项目实战化:爬取堆糖网研究所美好生活照
- icloud android 日历同步到iphone,Mac的日历事件如何同步到iphone-Mac的日历事件同步到iphone教程 - 河东软件园...
- 【搜索排序】预训练综述Pre-training Methods in Information Retrieval
- K线图|K线图分析法简介 |K线图怎么看
- 0到3个月的宝宝护理重点和注意事项,家长要记住哦
- H5音乐播放器(小清新版)
- 云端IDE:阿里云机器学习与PAI-DSW | 《阿里云机器学习PAI-DSW入门指南》
- 基于MR采样用户定位的高负荷扇区优化
- android 开机直接运行app并当做手机桌面
- 总线与接口(内部总线、系统总线、外部总线)