C / C ++ рдореЗрдВ QR рдХреЛрдб рдмрдирд╛рдирд╛

рдЫрд╡рд┐
рдпрд╣ FUKUCHI рдХреЗрдВрдЯрд╛рд░реЛ рдХреЗ libqrencode рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдХреБрдЫ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ bmp рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдВрдХ рд╕реЗ рднрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред libqrencode JIS (рдЬрд╛рдкрд╛рдиреА рдФрджреНрдпреЛрдЧрд┐рдХ рдорд╛рдирдХ) X0510: 2004 рдпрд╛ ISO / IEC 18004 рдореЗрдВ рд╡рд░реНрдгрд┐рдд QR рдХреЛрдб рдореЙрдбрд▓ 2 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред ECI рдФрд░ FNC1 QR рдХреЛрдб рдореЙрдбрд▓ 1 рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред


рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдХреНрдпреВрдЖрд░ рдХреЛрдб рдПрдХ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЬ, рд▓рдЧрднрдЧ рд╣рд░ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдореЗрдВ рдПрдХ QRCode рд░реАрдбрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╛рд░реВрдк рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: url, рд╕рдВрдкрд░реНрдХ, рдЖрджрд┐ред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, url рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ QR рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА libqrencode , рд▓реЗрдХрд┐рди рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ C / C ++ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ libqrencode рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗрд╡рд▓ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡реЗрджрди рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ url рдХреЛ рдПрдХ QR рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд bmp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред

рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ


рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ libqrencode рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреА рд╣реЛрдЧреА, рдЬреЛ рдПрдХ рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд (рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВред рддреЛ, url рдХреЛ QR рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ Win32 рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 #include <stdio.h> #include <tchar.h> #include <string.h> #include <errno.h> #include <conio.h> #include <ctype.h> #include <stddef.h> #include <stdlib.h> #include <wchar.h> #include "qrencode.h" //by libqrencode #define QRCODE_TEXT "http://ru.wikipedia.org/wiki/QR-%EA%EE%E4" // Text to encode into QRCode #define OUT_FILE "C:/test.bmp" // Output file name #define OUT_FILE_PIXEL_PRESCALER 8 // Number of pixels in bmp file for each QRCode pixel, on each dimension #define PIXEL_COLOR_R 0 // Color of bmp pixels #define PIXEL_COLOR_G 0 #define PIXEL_COLOR_B 0xff 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) int _tmain(int argc, _TCHAR** argv) { char* szSourceSring = QRCODE_TEXT; unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes; unsigned char* pRGBData, *pSourceData, *pDestData; QRcode* pQRC; FILE* f; /* *    .   *         QR-. * WARNING:   THREAD-UNSAFE,  pthread . * : * string:  ;    * version:  ;  0,       * level:    * hint:    ,       * QR_MODE_KANJI -     Shif-JIS * QR_MODE_8 -        .  UTF-8,    * casesensitive: case-sensitive(1)  (0). * return:   QRcode;    NULL  errno   * EINVAL:    * ENOMEM:        * ERANGE:     */ //  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; if (!(pRGBData = (unsigned char*)malloc(unDataBytes))) { printf("Out of memory"); exit(1); } memset(pRGBData, 0xff, unDataBytes); //   bmp BITMAPFILEHEADER kFileHeader; kFileHeader.bfType = 0x4d42; // "BM" kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nDataBytes; 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; //   QrCode  bmp  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++; } } if (!(fopen_s(&f, OUT_FILE, "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(pRGBData); QRcode_free(pQRC); } else { printf("NULL returned"); exit(1); } return 0; } 

рдбрд┐рдлрд╛рдЗрди рдХреЛ рдмрджрд▓рдХрд░, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдпреВрдЖрд░рдПрд▓ / рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ / рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░ / рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


Source: https://habr.com/ru/post/In182638/


All Articles