CreateQRCodeImage.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "stdafx.h"
  2. #include "CreateQRCodeImage.h"
  3. #include "QRCode\qrencode.h"
  4. #include "shared\TextConvert.h"
  5. #define QRCODE_TEXT "http://www.ultramundum.org/index.htm"; // Text to encode into QRCode
  6. #define OUT_FILE "C:/temp/test.bmp" // Output file name
  7. #define OUT_FILE_PIXEL_PRESCALER 8 // Prescaler (number of pixels in bmp file for each QRCode pixel, on each dimension)
  8. #define PIXEL_COLOR_R 0 // Color of bmp pixels
  9. #define PIXEL_COLOR_G 0
  10. #define PIXEL_COLOR_B 0
  11. CCreateQRCodeImage::CCreateQRCodeImage(void)
  12. {
  13. }
  14. CCreateQRCodeImage::~CCreateQRCodeImage(void)
  15. {
  16. }
  17. unsigned char* CCreateQRCodeImage::CreateImage(CString text, int &size)
  18. {
  19. char* szSourceSring = QRCODE_TEXT;
  20. unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
  21. unsigned char* pRGBData, *pSourceData, *pDestData;
  22. QRcode* pQRC;
  23. unsigned char* bitmapData = NULL;
  24. CStringA a;
  25. CTextConvert::ConvertToUTF8(text, a);
  26. if (pQRC = QRcode_encodeString(a, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
  27. {
  28. unWidth = pQRC->width;
  29. unWidthAdjusted = unWidth * OUT_FILE_PIXEL_PRESCALER * 3;
  30. if (unWidthAdjusted % 4)
  31. unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
  32. unDataBytes = unWidthAdjusted * unWidth * OUT_FILE_PIXEL_PRESCALER;
  33. // Allocate pixels buffer
  34. if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
  35. {
  36. return NULL;
  37. }
  38. // Preset to white
  39. memset(pRGBData, 0xff, unDataBytes);
  40. // Prepare bmp headers
  41. BITMAPFILEHEADER kFileHeader;
  42. kFileHeader.bfType = 0x4d42; // "BM"
  43. kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
  44. kFileHeader.bfReserved1 = 0;
  45. kFileHeader.bfReserved2 = 0;
  46. kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  47. BITMAPINFOHEADER kInfoHeader;
  48. kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
  49. kInfoHeader.biWidth = unWidth * OUT_FILE_PIXEL_PRESCALER;
  50. kInfoHeader.biHeight = -((int)unWidth * OUT_FILE_PIXEL_PRESCALER);
  51. kInfoHeader.biPlanes = 1;
  52. kInfoHeader.biBitCount = 24;
  53. kInfoHeader.biCompression = BI_RGB;
  54. kInfoHeader.biSizeImage = 0;
  55. kInfoHeader.biXPelsPerMeter = 0;
  56. kInfoHeader.biYPelsPerMeter = 0;
  57. kInfoHeader.biClrUsed = 0;
  58. kInfoHeader.biClrImportant = 0;
  59. pSourceData = pQRC->data;
  60. for(y = 0; y < unWidth; y++)
  61. {
  62. pDestData = pRGBData + unWidthAdjusted * y * OUT_FILE_PIXEL_PRESCALER;
  63. for(x = 0; x < unWidth; x++)
  64. {
  65. if (*pSourceData & 1)
  66. {
  67. for(l = 0; l < OUT_FILE_PIXEL_PRESCALER; l++)
  68. {
  69. for(n = 0; n < OUT_FILE_PIXEL_PRESCALER; n++)
  70. {
  71. *(pDestData + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_B;
  72. *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_G;
  73. *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_R;
  74. }
  75. }
  76. }
  77. pDestData += 3 * OUT_FILE_PIXEL_PRESCALER;
  78. pSourceData++;
  79. }
  80. }
  81. size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
  82. bitmapData = new unsigned char[size];
  83. memcpy(bitmapData, &kFileHeader, sizeof(BITMAPFILEHEADER));
  84. memcpy((bitmapData + sizeof(BITMAPFILEHEADER)), &kInfoHeader, sizeof(BITMAPINFOHEADER));
  85. memcpy((bitmapData + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)), pRGBData, unDataBytes);
  86. /*if (!(fopen_s(&f, OUT_FILE, "wb")))
  87. {
  88. fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
  89. fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
  90. fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
  91. fclose(f);
  92. }*/
  93. free(pRGBData);
  94. QRcode_free(pQRC);
  95. }
  96. else
  97. {
  98. printf("NULL returned");
  99. }
  100. return bitmapData;
  101. }