1. ホーム
  2. C++

C/C++のQRコード生成ライブラリqrencodeの利用

2022-02-26 10:46:32

1. qrencode ライブラリを https://fukuchi.org/works/qrencode/ からダウンロードしました。 qrencode-4.0.2.tar.gz のバージョンです。

2. このライブラリの vs 解を生成するために、ここではクロスプラットフォームコンパイルツールである cmake を使用します。まずcmakeをインストールします。cmakeのインストーラ(Windows版)は、https://cmake.org/download/ からダウンロードしてください。 

私は、https://cmake.org/files/v3.12/cmake-3.12.0-rc1-win64-x64.msi 版をダウンロードしました。

cmake-3.12.0-rc1-win64-x64.msiをインストール後、システムパスを

3. 解凍 qrencode-4.0.2.tar.gz で、cmdコマンドでコマンドラインを開き、ディレクトリに移動して、以下のcmakeコマンドで解を生成します。

cmake 。-DGETOPT_INCLUDE_DIR=" ライブラリヘッダを配置するディレクトリ " -DGETOPT_LIBRARIES=" ライブラリファイルが置かれているディレクトリ "。

注:-Dはdefine variableの略で、使用法は以下の通りです。-D 変数名 = 変数値。

本ライブラリのサンプルコードでは、QRコード画像の生成にlibpngライブラリを使用しており、libpngライブラリはzlibライブラリに依存しているため、libpngライブラリとzlibライブラリをダウンロードし、この2つのライブラリに対応するヘッダーファイルとライブラリファイルを"に配置する必要があります。 ライブラリヘッダがあるディレクトリ "と" ライブラリファイルが置かれているディレクトリ "にあります。もし、面倒なことを気にしないのであれば、bmp形式の画像を生成すれば、2つのライブラリをリンクする必要はありません、ポイント4を参照してください。

4. libpng と zlib をリンクする代わりに、コマンドを直接使用します: cmake . -DGETOPT_INCLUDE_DIR="" -DGETOPT_LIBRARIES=""

pngが見つからないというエラーも報告されますが、この時点ではそのディレクトリにQRencode.slnソリューションが生成されているので問題ありません。

cmake コマンドで変数 -DGETOPT_INCLUDE_DIR="" と -DGETOPT_LIBRARIES="" を定義しているのはなぜですか?

GETOPT_INCLUDE_DIRとGETOPT_LIBRARIESを定義しないと、この2つの変数が見つからないというエラーが報告されるからです。

5. 5. QRencode.slnを直接開いてください。 , qrencode は静的ライブラリプロジェクトで、Debug/Release ディレクトリに qrencoded.lib ライブラリを生成するためにコンパイルされ、このライブラリのインターフェイスを使用します。 QRcode_encodeString QRコード情報を生成することができ、qrencodeの使用方法を記述するもので、pngライブラリを使用しますが、私は使用しないので、直接コンパイルすると、ヘッダーファイルが見つからないというエラーが報告されますので、わざわざ解決することはありませんでした。

6、QRコードの情報は、bmp形式のQRコード画像に生成されます、あなたはqrencoded.libライブラリをリンクする新しいプロジェクトを作成することができます、bmpのQRコード画像を生成するために、次のコードを呼び出す。

void qr_code(std::string _src_str, std::string _dst_bmp_path)
{
    // The parameter _src_str is the string to be encoded, and _dst_bmp_path is the name of the bmp path generated after encoding into a 2D code, e.g. . /my_qrcode.bmp
    const char* szSourceSring = _src_str.c_str();
    unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
    unsigned char* pRGBData, *pSourceData, *pDestData;
    QRcode* pQRC;
    FILE* f;

    if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
    {
        unWidth = pQRC->width;
        unWidthAdjusted = unWidth * 8 * 3;
        if (unWidthAdjusted % 4)
            unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
        unDataBytes = unWidthAdjusted * unWidth * 8;
        // Allocate pixels buffer
        if (! (pRGBData = (unsigned char*)malloc(unDataBytes)))
        {
            exit(-1);
        }
        // Preset to white
        memset(pRGBData, 0xff, unDataBytes);
        // Prepare bmp headers
        BITMAPFILEHEADER kFileHeader;
        kFileHeader.bfType = 0x4d42; // "BM"
        kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
        kFileHeader.bfReserved1 = 0;
        kFileHeader.bfReserved2 = 0;
        kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        BITMAPINFOHEADER kInfoHeader;
        kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
        kInfoHeader.biWidth = unWidth * 8;
        kInfoHeader.biHeight = -((int)unWidth * 8);
        kInfoHeader.biPlanes = 1;
        kInfoHeader.biBitCount = 24;
        kInfoHeader.biCompression = BI_RGB;
        kInfoHeader.biSizeImage = 0;
        kInfoHeader.biXPelsPerMeter = 0;
        kInfoHeader.biYPelsPerMeter = 0. kInfoHeader.biYPelsPerMeter = 0;
        kInfoHeader.biClrUsed = 0. kInfoHeader.biClrUsed = 0;
        kInfoHeader.biClrImportant = 0. kInfoHeader.biClrImportant = 0;

        // Convert QrCode bits to bmp pixels
        pSourceData = pQRC->data;
        for (y = 0; y < unWidth; y++)
        {
            pDestData = pRGBData + unWidthAdjusted * y * 8;
            for (x = 0; x < unWidth; x++)
            {
                if (*pSourceData & 1)
                {
                    for (l = 0; l < 8; l++)
                    {
                        for (n = 0; n < 8; n++)

                        {
                             // The following three lines are to set the three base colors, the three base colors are set to 0x00, then the generated QR code image is black, what color you want to adjust
                            *(pDestData + n * 3 + unWidthAdjusted * l) = 0x00;            
                            *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0x00;
                            *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0x00;
                        }
                    }
                }
                pDestData += 3 * 8;
                pSourceData ++;
            }
        }

        // Output the bmp file
        if (! (fopen_s(&f, _dst_bmp_path.c_str(), "wb")))
        {
            fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
            fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
            fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
            printf("qrcode has generated in %s\n", _dst_bmp_path.c_str());
            fclose(f);
        }
        else
        {
            printf("Unable to open file");
            exit(-1);
        }
        // Free data
        free(pRGBData);
        QRcode_free(pQRC);
    }
    else
    {
        printf("NULL returned");
        exit(-1);
    }
}


ビットマップを生成するためのコードリファレンス:https://blog.csdn.net/sunnyloves/article/details/53053487

注:当初は別のライブラリ( qrcode ライブラリ )でQRコード画像(https://github.com/rsky/qrcode)を生成していたところ、エンコードする文字列が長すぎる場合に生成されるQRコードが正しく解析できないことが判明したため、本製品に切り替えた。 qrencode ライブラリは、現在qrencodeが非常によく動作しており、推奨されます。