1、下载安装git
可以使用国内的淘宝npm镜像下载,网址: https://npm.taobao.org/mirrors/git-for-windows/
2、配置xshell 使用git及相关命令
3、git clone https://github.com/nayuki/QR-Code-generator.git,获取c头文件与接口
4、解析BMP,根据qr库生成图像数据填入
a、
typedef struct
{
uint16_t type; //位图文件的类型,必须为BM(1-2字节)
uint32_t size; //位图文件的大小,以字节为单位(3-6字节,低位在前)
uint16_t reserved1; //位图文件保留字,必须为0(7-8字节)
uint16_t reserved2; //位图文件保留字,必须为0(9-10字节)
uint32_t off_bits; //位图数据位置的地址偏移,即起始位置,以相对于位图(11-14字节,低位在前)
}__attribute__ ((packed)) bmp_file_header_t;
typedef struct
{
uint32_t size; //定义以下用来描述影像的区块(BitmapInfoHeader)的大小,即本结构所占用字节数,它的值是:40
int32_t width; //位图宽度,以像素为单位
int32_t height; //位图高度,以像素为单位
uint16_t planes; //保存所用彩色位面的个数。不经常使用
uint16_t bit_count; //保存每个像素的位数,它是图像的颜色深度。常用值是1(双色灰阶)、4(16色灰阶)、8(256色灰阶)和24(彩色)。
uint32_t compression; /*
定义所用的压缩算法。允许的值是0、1、2、3、4、5。
0 - 没有压缩(也用BI_RGB表示)
1 - 行程长度编码 8位/像素(也用BI_RLE8表示)
2 - 行程长度编码4位/像素(也用BI_RLE4表示)
3 - Bit field(也用BI_BITFIELDS表示)
4 - JPEG图像(也用BI_JPEG表示)
5 - PNG图像(也用BI_PNG表示)
*/
uint32_t size_image; //位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位。这是原始位图数据的大小,不要与文件大小混淆
//设置为BI_RGB时可为0
uint32_t x_pels_permeter; //位图水平分辨率,每米像素数
uint32_t y_pels_permeter; //位图垂直分辨率,每米像素数
uint32_t clr_used; //位图实际使用的颜色表中的颜色数
uint32_t clr_important; //位图显示过程中重要的颜色数,当每个颜色都重要时这个值与颜色数目(clr_used)相等
} bmp_info_header_t;
b、使用画图3d生成200 * 200 纯色图片,读取文件头进行对照
代码如下:
FILE* fp = fopen("./1.bmp", "rb+");
if(fp == NULL) {
printf("fopen error\n");
return 0;
}
bmp_file_header_t bmp_file_header;
bmp_info_header_t bmp_info_header;
fread(&bmp_file_header, 1, sizeof(bmp_file_header_t), fp);
fread(&bmp_info_header, 1, sizeof(bmp_info_header), fp);
fclose(fp);
读取数据:
type=BM
size=120054
reserved1=0
reserved2=0
off_bits=54
size=40
width=200
height=200
planes=1
bit_count=24
compression=0
size_image=0
x_pels_permeter=3780
y_pels_permeter=3780
clr_used=0
clr_important=0
5、根据qr库生成图像数据填入bmp数据部
fwrite(&bmp_file_header, 1, sizeof(bmp_file_header_t), fp);
fwrite(&bmp_info_header, 1, sizeof(bmp_info_header), fp);
int i, j;
unsigned short rgb_w = 0xFFFF;
unsigned short rgb_b = 0x0000;
for(i = 0;i < size;i++){
for(j = 0;j < size;j++) {
if(qrcodegen_getModule(qrcode, j, i)){
fwrite(&rgb_b, 2, 1, fp);
}else{
fwrite(&rgb_w, 2, 1, fp);
}
}
fwrite("\0\0\0\0", width - size * 2, 1, fp);
}
6、效果图