VC++生成QR-Code格式的二維碼
阿新 • • 發佈:2019-02-03
本望斷在影象生成QR-Code格式的二維碼
根據此編寫出的生成QR-Code和Data-Matrix的二維碼(庫)
本秋高使用到的軟體工具:VS2010 qrencode.h qrencode.lib(使用以上現有庫直接實現功能)
VS2010就不用說了;使用靜態庫函式的步驟也可以的,此部分作基礎就不進行闡述
#include "qrencode.h" #include <iostream> using namespace std; #define PIXEL_COLOR_R 0// Color of bmp pixels #define PIXEL_COLOR_G 0 #define PIXEL_COLOR_B 0 #define OUT_FILE_PIXEL_PRESCALER 8 //BMP defines typedef unsigned short WORD; typedef unsigned long DWORD; typedef signed long LONG; #define BI_RGB 0L #pragma pack(push, 2) typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER1; typedef struct { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER1; #pragma pack(pop) bool daixuechuping_QR_Code(char *QR_text, char *bmpSavedPath, QRecLevel level, QRencodeMode hint) { const char* DXsring = QR_text; const char* CPsring = bmpSavedPath; unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes; unsigned char* pRGBData, *pSourceData, *pDestData; QRcode* pQR; FILE* DXCP; if (pQR = QRcode_encodeString(DXsring, 0, level, hint, 1)) { unWidth = pQR->width; //矩陣的維數 unWidthAdjusted = unWidth * OUT_FILE_PIXEL_PRESCALER * 3; //每一個維度佔的畫素的個數(8),每個畫素3個位元組 if (unWidthAdjusted % 4) { unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4; } unDataBytes = unWidthAdjusted * unWidth * OUT_FILE_PIXEL_PRESCALER; // Allocate pixels buffer if (!(pRGBData = (unsigned char*)malloc(unDataBytes))) { return false; } // Preset to white memset(pRGBData, 0xff, unDataBytes); // Prepare bmp headers BITMAPFILEHEADER1 bmpFileHeader; bmpFileHeader.bfType = 0x4d42; // "BM" bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes; bmpFileHeader.bfReserved1 = 0; bmpFileHeader.bfReserved2 = 0; bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER1 bmpInfoHeader; bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfoHeader.biWidth = unWidth * OUT_FILE_PIXEL_PRESCALER; bmpInfoHeader.biHeight = -((int)unWidth * OUT_FILE_PIXEL_PRESCALER); //負數可以控制影象上下顛倒 bmpInfoHeader.biPlanes = 1; bmpInfoHeader.biBitCount = 24; bmpInfoHeader.biCompression = BI_RGB; bmpInfoHeader.biSizeImage = 0; bmpInfoHeader.biXPelsPerMeter = 0; bmpInfoHeader.biYPelsPerMeter = 0; bmpInfoHeader.biClrUsed = 0; bmpInfoHeader.biClrImportant = 0; pSourceData = pQR->data; //Convert QrCode bits to bmp pixels for( y = 0; y < unWidth; y++) { pDestData = pRGBData + unWidthAdjusted * y * OUT_FILE_PIXEL_PRESCALER; for(x = 0; x < unWidth; x++) { if( *pSourceData & 1) { for(l = 0; l < OUT_FILE_PIXEL_PRESCALER; l++) { for(n = 0; n < OUT_FILE_PIXEL_PRESCALER; n++) { *(pDestData + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_B; *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_G; *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_R; } } } pDestData += 3 * OUT_FILE_PIXEL_PRESCALER; pSourceData++; } } //Output the bmp file if (!(fopen_s(&DXCP, CPsring, "wb"))) { fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER1), 1, DXCP); fwrite(&bmpInfoHeader, sizeof(BITMAPINFOHEADER1), 1, DXCP); fwrite(pRGBData, sizeof(unsigned char), unDataBytes, DXCP); fclose(DXCP); } //Free data free(pRGBData); QRcode_free(pQR); } else { return false; } return true; }