1. 程式人生 > >libqrencode學習筆記(二): 用libqrencode靜態庫庫生成二維碼並儲存為BMP圖片

libqrencode學習筆記(二): 用libqrencode靜態庫庫生成二維碼並儲存為BMP圖片

#include <stdio.h>
#include <Windows.h>
#include <qrencode.h>

#pragma comment(lib,"libqrencode.lib")

int main()
{
	const char * QRTEXT = "歡迎來到Jinato的部落格";
	QRcode * qrCode;
	int version = 5;//設定版本號,這裡設為5,對應尺寸:37 * 37
	QRecLevel level = QR_ECLEVEL_H;
	QRencodeMode hint = QR_MODE_8;
	int casesensitive = 1;
	qrCode = QRcode_encodeString(QRTEXT, version, level, hint, casesensitive);
	if (NULL == qrCode)
	{
		printf("QRcode create fail\n");
		return -1;
	}

	//將要生成的二維碼儲存為BMP真彩色圖片檔案
	FILE * pf = fopen("qrcode.bmp", "wb");
	if (NULL == pf)
	{
		printf("file open fail.\n");
		fclose(pf);
		return -1;
	}
	int width = qrCode->width;
	int height = qrCode->width;
	int biCount = 24;//真彩色
	int lineByte = (width * biCount / 8 + 3) / 4 * 4; //每line位元組數必須為4的倍數
	//點陣圖檔案頭
	BITMAPFILEHEADER bitMapFileHeader;
	bitMapFileHeader.bfType = 0x4D42;
	bitMapFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lineByte * height;
	bitMapFileHeader.bfReserved1 = 0;
	bitMapFileHeader.bfReserved2 = 0;
	bitMapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	//點陣圖資訊頭
	BITMAPINFOHEADER bitMapInfoHeader;
	bitMapInfoHeader.biBitCount = biCount;
	bitMapInfoHeader.biClrImportant = 0;
	bitMapInfoHeader.biClrUsed = 0;
	bitMapInfoHeader.biCompression = 0;
	bitMapInfoHeader.biHeight = height;
	bitMapInfoHeader.biPlanes = 1;
	bitMapInfoHeader.biSize = 40;
	bitMapInfoHeader.biSizeImage = lineByte * height;
	bitMapInfoHeader.biWidth = width;
	bitMapInfoHeader.biXPelsPerMeter = 0;
	bitMapInfoHeader.biYPelsPerMeter = 0;
	//寫檔案頭進檔案
	fwrite(&bitMapFileHeader, sizeof(BITMAPFILEHEADER), 1, pf);
	//寫點陣圖資訊頭進檔案
	fwrite(&bitMapInfoHeader, sizeof(BITMAPINFOHEADER), 1, pf);
	unsigned char * pBMPData = new unsigned char[lineByte * height];
	memset(pBMPData, 255, lineByte * height);

	unsigned char * qrData = qrCode->data;
	for (int i = 0; i < height; i++)
	{
		for (int 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++;
		}
	}

	//寫資料進檔案
	fwrite(pBMPData, sizeof(unsigned char), lineByte * height, pf);
	fclose(pf);
	delete[] pBMPData;
	pBMPData = NULL;
	
	QRcode_free(qrCode);
	return 0;
}

3 效果

執行後生成的qrcode.bmp檔案,因為尺寸只有37*37,所以非常小,用微信或其他二維碼掃描工具可描出:歡迎來到Jinato的部落格。
DEMO程式碼下載地址:點選開啟連結