c语言生成 二维码

c语言生成 二维码

这是第一次 写文档也是自己做的一些项目的感触 就简单记录一下。

二维码的粗略信息

想要生成一个二维码,就必须准备好你生产的内容。二维码分为
H ,Q,M,L 四种容错等级 和 30个版本 第一个版本为 21 * 21
个像素点. 之后的每个版本 都是增加 4个像素点 。共计30个版本 .
大小就是 21 到 177 。

生产二维码信息

生产二维码需要信息 根据你要生产的信息的多少制定一个
qrtext 的信息 可以定义一个信息字符数组 例如 for info[64];

QRcode * qrCode;
int version = 8;
//  二维码的版本 也可以理解为二维码大小 ;
QRecLevel level = QR_ECLEVEL_L;
//二维码的容错程度  这里是最低的L
QRencodeMode hint = QR_MODE_8;
//二维码的模式
int casesensitive = 1;
qrCode = QRcode_encodeString(QRTEXT, version, level, hint, casesensitive);
//生产二维码的数据   
//qrtext  就是我们二维码信息

我们就把二维码的大小等信息进行的设定.之后就是生产一张位图将信息写入到其中。

生成位图和写入信息

if (NULL == qrCode)
{
printf(“QRcode create fail\n”);
}

snprintf(buff,20,"%s",QR_CODE_FILE);

FILE * pf = fopen(buff, "w+");
if (NULL == pf)
{
	printf("file open fail.\n");
	fclose(pf);
	//return -1;
}
int width = qrCode->width;
int height = qrCode->width;
int biCount = 24;
   
int iexwidth = width;
if(width % 8){
	iexwidth += 8;
}

iexwidth /= 8;

int lineByte = (iexwidth + 3) & ~0x03;
BITMAPFILEHEADER bitMapFileHeader;
bitMapFileHeader.bfType = 0x4D42; 
bitMapFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) + lineByte * height; 
bitMapFileHeader.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 = 296;   
bitMapInfoHeader.biXPelsPerMeter = 0; 
bitMapInfoHeader.biYPelsPerMeter = 0;	
bitMapInfoHeader.biClrUsed = 0; 	
bitMapInfoHeader.biClrImportant = 0;  

//生成 1 ,2,4,8色位图时需要加入调色板

unsigned char * pBMPData = (unsigned char *)malloc(lineByte * height);//new  unsigned char[lineByte * height];
memset(pBMPData, 0, lineByte * height);

unsigned char * qrData = qrCode->data;
int ibit;
int ibyte;
int i,j;
for (i=0; i < height; i++)
 {
	 for ( j = 0; j < lineByte/3; j++)
	 {
		 if (*(qrData) & 1)
		 {
			 //设置rgb颜色,可自定义设置,这里设为黑色。
			 *(pBMPData + lineByte * i + 3 * j) = 0;
			 *(pBMPData + lineByte * i + 3 * j + 1) = 0;
			 *(pBMPData + lineByte * i + 3 * j + 2) = 0;
		 }
		 qrData++;
	 }
 }

//生产位图时应注意默认的背景 最好自己把背景设置好。

count = fwrite(pBMPData, sizeof(unsigned char), lineByte * height, pf);
fclose(pf);

free(pBMPData);
pBMPData = NULL;
QRcode_free(qrCode);
//后面为释放掉资源
}
我们就生成好了一个24位位图的二维码了。
  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值