二維碼簡介
二維碼是一個(gè)目前應(yīng)用范圍極廣的一種編碼方式。通過特定的幾何圖形,用黑白相間的點(diǎn)組成,利用計(jì)算機(jī)二進(jìn)制0,1的概念,將字符串信息編碼進(jìn)圖形中。從而可以通過光電掃描設(shè)備,如手機(jī)等來進(jìn)行快速識(shí)別。
相比于一維條碼,二維碼存儲(chǔ)信息量更大,可靠性高,更易識(shí)別,可以在扭曲,部分遮擋的情況下被識(shí)別。
qrencode庫簡介
二位碼最常見的編碼為QR code,qrencode是一個(gè)滿足QR code標(biāo)準(zhǔn)的開源庫。可以適用于各個(gè)平臺(tái)。
Wince下使用方式
1、可以在GITHUB找到qrencode庫最新下載。
2、新建一個(gè)wince平臺(tái)的工程,選擇新建c++下smart device的win32工程,選在一個(gè)WINCE平臺(tái),工程類型選擇Static library。
3、將下載的qrencode庫里的.h文件及.c文件都添加入工程中,選擇編譯。
4、編譯可能會(huì)提示一些環(huán)境變量不存在的錯(cuò)誤,比如errno = EINVAL;中的EINVAL未定義,將這類代碼注釋掉,這是因?yàn)閣ince將這部分功能精簡掉了。
5、最終編譯成功會(huì)生成qrencodece.lib,將它和qrencodece.h添加入自己工程便可以使用了。
6、定義一個(gè)Qrcode指針,調(diào)用方法QRcode_encodeString,傳入?yún)?shù)1,要編碼的字符串,參數(shù)2,編碼的糾錯(cuò)等級(jí),參數(shù)3,編碼模式,通常使用QR_MODE_8,參數(shù)4,1或0,表示是否區(qū)分大小寫。這樣就可以獲得一個(gè)編碼后的2進(jìn)制數(shù)組的數(shù)據(jù)指針。
QRcode* pQRC; pQRC = QRcode_encodeString(“emtronix”, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
7、將該二維碼據(jù)顯示到屏幕中。
int width = pQRC->width; CBrush brush; brush.CreateStockObject(LTGRAY_BRUSH); m_dcMem.FillRect(m_rect,&brush); brush.DeleteObject(); int x, y, l, n; unsigned char* pData; pData = pQRC->data; for (y= 0;y<width;y++) { for (x= 0;x<width;x++) { if (*pData & 1) { for (l = 0; l < 8; l++) { for (n = 0; n < 8; n++) { m_dcMem.SetPixel(x*8+l, y*8+n,RGB(0,0,0)); } } } pData++; } } CDC *pDC=GetDC(); pDC->BitBlt(16, 40, 512, 512, &m_dcMem, 0, 0, SRCCOPY); ReleaseDC(pDC); QRcode_free(pQRC);
8、將該二維碼數(shù)據(jù)保存到bmp格式圖片文件中。
Width = pQRC->width; Widthbmp = Width * 8 * 3; if (Widthbmp % 4) Widthbmp = (Widthbmp / 4 + 1) * 4; unDataBytes = Widthbmp * Width * 8; pRGBData = (unsigned char*)malloc(unDataBytes); memset(pRGBData, 0xff, unDataBytes); BITMAPFILEHEADER BmpHeader; BmpHeader.bfType = 0x4d42; // "BM" BmpHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes; BmpHeader.bfReserved1 = 0; BmpHeader.bfReserved2 = 0; BmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER InfoHeader; InfoHeader.biSize = sizeof(BITMAPINFOHEADER); InfoHeader.biWidth = Width * 8; InfoHeader.biHeight = -((int)Width * 8); InfoHeader.biPlanes = 1; InfoHeader.biBitCount = 24; InfoHeader.biCompression = BI_RGB; InfoHeader.biSizeImage = 0; InfoHeader.biXPelsPerMeter = 0; InfoHeader.biYPelsPerMeter = 0; InfoHeader.biClrUsed = 0; InfoHeader.biClrImportant = 0; pSourceData = pQRC->data; for (y = 0; y < Width; y++) { pDestData = pRGBData + Widthbmp * y * 8; for (x = 0; x < Width; x++) { if (*pSourceData & 1) { for (l = 0; l < 8; l++) { for (n = 0; n < 8; n++) { *(pDestData + n * 3 + Widthbmp * l) = 0; *(pDestData + 1 + n * 3 + Widthbmp * l) = 0; *(pDestData + 2 + n * 3 + Widthbmp * l) = 0; } } } pDestData += 3 * 8; pSourceData++; } } if (!(fopen_s(&f, "test.bmp", "wb"))) { fwrite(&BmpHeader, sizeof(BITMAPFILEHEADER), 1, f); fwrite(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, f); fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f); fclose(f); } free(pRGBData); QRcode_free(pQRC);
其它
因?yàn)槎S碼擁有校正功能,所以可以遮擋一部分內(nèi)容同時(shí)不影響識(shí)別。常見的二維碼中,很多都在中心部位添加上一個(gè)自定義的logo,用戶可以可以根據(jù)自身項(xiàng)目需求直接添加,不需要增加其它操作。
英創(chuàng)提供了文章內(nèi)所述程序及源代碼,有需要的客戶可以聯(lián)系英創(chuàng)工程師獲得。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660