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位位图的二维码了。