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位位圖的二維碼了。