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位位圖的二維碼了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章