C语言实现生成二维码的单色位图

  硬件环境: Arm      移植过二维码的库qrencode

   本文主要是实现一种单色位图的二维码的生成,前期需要自己移植二维码的库,下面就是具体的生成代码,主要流程就是将二维码库函数生成的数据放到自己已经构建好的单色位图中

void MakeQrencode(const char *QRTEXT)
 { 	  
	 QRcode * qrCode;
	 int version = 10;				    //设置版本号,这里设为10,对应尺寸:57*57
	 QRecLevel 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;	//图片大小  单位:byte
	 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 = 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);
 }

 

  生成的二维码图片:

                       

 

你可能感兴趣的:(图片)