VC++ QRCode產生器[VC_QRCodeGenerator]
VC++ QRCode產生器[VC_QRCodeGenerator]
資料來源:https://www.codeproject.com/Articles/593591/Simple-C-Cplusplus-QRCode-Library
GITHUB:https://github.com/jash-git/VC_QRCodeGenerator
將範例修改成 可用BAT呼叫 並把QR CODE顏色改成黑色 [VS2015 修改 OK]
// --------------------------------------------------------------------------- // // QRGenerator // // Create: 15/05/2013 // Last update: 15/05/2013 // // Author: TWOTM // // // Note: // // /o ULTRAMUNDUM FOUNDATION - all rights reserved // --------------------------------------------------------------------------- // ------------------------------------------------------- // Includes // ------------------------------------------------------- #include "stdafx.h" #include <string.h> #include <errno.h> #include <conio.h> #include <ctype.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <wchar.h> #include "qrencode.h" // ------------------------------------------------------- // ------------------------------------------------------- // DEFines // ------------------------------------------------------- #define QRCODE_TEXT "http://jashliao.eu"; // Text to encode into QRCode #define OUT_FILE "test.bmp" // Output file name #define OUT_FILE_PIXEL_PRESCALER 8 // Prescaler (number of pixels in bmp file for each QRCode pixel, on each dimension) #define PIXEL_COLOR_R 0x00 // Color of bmp pixels #define PIXEL_COLOR_G 0x00 #define PIXEL_COLOR_B 0x00 // 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; } BITMAPFILEHEADER; typedef struct { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; #pragma pack(pop) // ------------------------------------------------------- // ------------------------------------------------------- // Main // ------------------------------------------------------- int main(int argc, char *argv[])//_tmain(int argc, _TCHAR* argv[]) { //char* szSourceSring = QRCODE_TEXT; char* szSourceSring = argv[argc - 2]; char* szNameSring = argv[argc - 1]; unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes; unsigned char* pRGBData, *pSourceData, *pDestData; QRcode* pQRC; FILE* f; /* * Create a symbol from the string. The library automatically parses the input * string and encodes in a QR Code symbol. * @warning This function is THREAD UNSAFE when pthread is disabled. * @param string input string. It must be NUL terminated. * @param version version of the symbol. If 0, the library chooses the minimum * version for the given input data. * @param level error correction level. * @param hint tell the library how non-alphanumerical characters should be * encoded. If QR_MODE_KANJI is given, kanji characters will be * encoded as Shif-JIS characters. If QR_MODE_8 is given, all of * non-alphanumerical characters will be encoded as is. If you want * to embed UTF-8 string, choose this. * @param casesensitive case-sensitive(1) or not(0). * @return an instance of QRcode class. The version of the result QRcode may * be larger than the designated version. On error, NULL is returned, * and errno is set to indicate the error. See Exceptions for the * details. * @throw EINVAL invalid input object. * @throw ENOMEM unable to allocate memory for input objects. * @throw ERANGE input data is too large. */ // Compute QRCode if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1)) { unWidth = pQRC->width; unWidthAdjusted = unWidth * OUT_FILE_PIXEL_PRESCALER * 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))) { printf("Out of memory"); exit(-1); } // Preset to white memset(pRGBData, 0xff, unDataBytes); // Prepare bmp headers BITMAPFILEHEADER kFileHeader; kFileHeader.bfType = 0x4d42; // "BM" kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes; kFileHeader.bfReserved1 = 0; kFileHeader.bfReserved2 = 0; kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER kInfoHeader; kInfoHeader.biSize = sizeof(BITMAPINFOHEADER); kInfoHeader.biWidth = unWidth * OUT_FILE_PIXEL_PRESCALER; kInfoHeader.biHeight = -((int)unWidth * OUT_FILE_PIXEL_PRESCALER); kInfoHeader.biPlanes = 1; kInfoHeader.biBitCount = 24; kInfoHeader.biCompression = BI_RGB; kInfoHeader.biSizeImage = 0; kInfoHeader.biXPelsPerMeter = 0; kInfoHeader.biYPelsPerMeter = 0; kInfoHeader.biClrUsed = 0; kInfoHeader.biClrImportant = 0; // Convert QrCode bits to bmp pixels pSourceData = pQRC->data; 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(&f, szNameSring, "wb"))) { fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f); fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f); fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f); fclose(f); } else { printf("Unable to open file"); exit(-1); } // Free data free(pRGBData); QRcode_free(pQRC); } else { printf("NULL returned"); exit(-1); } return 0; } // -------------------------------------------------------