<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++
    国产精品久久无码一区二区三区网| 日本精品高清一区二区| 精品在线视频免费| 中文国产成人精品久久app| 麻豆精品久久精品色综合| 亚洲精品偷拍无码不卡av| 杨幂精品国产福利在线| 99精品国产99久久久久久97| 91久久精品国产91久久性色也 | 久久精品中文字幕首页| 2021国产成人午夜精品| 四库影院永久在线精品| 久久精品国产亚洲AV网站| 夜夜高潮夜夜爽国产伦精品| 久久久久国产精品免费免费不卡| 少妇人妻偷人精品无码AV| 久久国产精品无码网站| 亚洲中文字幕久久精品无码2021| 精品视频一区在线观看| 国产精品电影在线观看| 国产成人精品AA毛片| 国产高清在线精品免费软件| 久久精品这里热有精品| 色哟哟国产精品免费观看 | 91精品久久久久久久久久小网站 | 国产美女精品人人做人人爽| 亚洲午夜国产精品| 久久96精品国产| 国产精品久久久久999| 国产乱码精品一区二区三区中文| 2020国产成人久久精品| 国产自偷亚洲精品页65页| 国产午夜福利久久精品| 国产精品乱码久久久久久软件| 亚洲国产精品久久丫 | 亚洲午夜国产精品| 无码精品国产一区二区三区免费| 99热婷婷国产精品综合| 国产精品成人99久久久久91gav | 亚洲国产精品成人精品无码区| 精品午夜福利1000在线观看|