<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 使用開源qrencode庫生成二維碼

     2022-5-5     作者:楊陽         
    文章標(biāo)簽:C/C++

    二維碼簡介


      二維碼是一個目前應(yīng)用范圍極廣的一種編碼方式。通過特定的幾何圖形,用黑白相間的點組成,利用計算機二進(jìn)制0,1的概念,將字符串信息編碼進(jìn)圖形中。從而可以通過光電掃描設(shè)備,如手機等來進(jìn)行快速識別。


      相比于一維條碼,二維碼存儲信息量更大,可靠性高,更易識別,可以在扭曲,部分遮擋的情況下被識別。


    qrencode庫簡介


      二位碼最常見的編碼為QR code,qrencode是一個滿足QR code標(biāo)準(zhǔn)的開源庫。可以適用于各個平臺。


    Wince下使用方式


      1、可以在GITHUB找到qrencode庫最新下載。

      2、新建一個wince平臺的工程,選擇新建c++下smart device的win32工程,選在一個WINCE平臺,工程類型選擇Static library。

      3、將下載的qrencode庫里的.h文件及.c文件都添加入工程中,選擇編譯。

      4、編譯可能會提示一些環(huán)境變量不存在的錯誤,比如errno = EINVAL;中的EINVAL未定義,將這類代碼注釋掉,這是因為wince將這部分功能精簡掉了。

      5、最終編譯成功會生成qrencodece.lib,將它和qrencodece.h添加入自己工程便可以使用了。

      6、定義一個Qrcode指針,調(diào)用方法QRcode_encodeString,傳入?yún)?shù)1,要編碼的字符串,參數(shù)2,編碼的糾錯等級,參數(shù)3,編碼模式,通常使用QR_MODE_8,參數(shù)4,1或0,表示是否區(qū)分大小寫。這樣就可以獲得一個編碼后的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);


    使用開源qrencode庫生成二維碼.png


      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);


    其它


      因為二維碼擁有校正功能,所以可以遮擋一部分內(nèi)容同時不影響識別。常見的二維碼中,很多都在中心部位添加上一個自定義的logo,用戶可以可以根據(jù)自身項目需求直接添加,不需要增加其它操作。


      英創(chuàng)提供了文章內(nèi)所述程序及源代碼,有需要的客戶可以聯(lián)系英創(chuàng)工程師獲得。

    文章標(biāo)簽:C/C++
    久久99国产这里有精品视| 国产精品第44页| 国产精品网站在线观看免费传媒| 精品一线二线三线区别在哪欧美| 久久精品影院永久网址| 久久久精品久久久久久| 国产精品视频无圣光一区| 久久精品久噜噜噜久久| 日韩人妻精品一区二区三区视频 | 国产精品大全国产精品| 久久国产精品鲁丝片| 99久久精品国产免看国产一区| 国产成人精品影院狼色在线| 人妻少妇看A偷人无码精品| 亚洲精品视频在线观看免费| 久久福利青草精品资源站| 久久精品中文字幕有码| 无码人妻精品一区二区蜜桃百度| 国产欧美另类久久久精品图片 | 久久久久久久91精品免费观看| 日韩精品乱码AV一区二区| 国产精品无码a∨精品| 久久久无码精品亚洲日韩软件| 国产精品久久亚洲一区二区| 99久久综合精品五月天| 免费精品国偷自产在线在线| 精品国产免费人成电影在线观看| 性欧洲精品videos| 久久国产精品久久久久久久久久 | 国产精品福利一区| 精品国产自在钱自| 麻豆亚洲AV成人无码久久精品 | 国产99久久久国产精品小说| 国产网站麻豆精品视频| 色妞妞www精品视频| 国产精品久久久天天影视| 国产91精品在线观看| 亚洲欧洲日本精品| 国产精品揄拍一区二区久久| 精品国产乱码久久久久软件| 国产在线观看麻豆91精品免费|