libqrencode學習筆記(二): 用libqrencode靜態庫庫生成二維碼並儲存為BMP圖片
阿新 • • 發佈:2019-02-16
#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程式碼下載地址:點選開啟連結