C/C++のQRコード生成ライブラリqrencodeの利用
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が非常によく動作しており、推奨されます。
関連
-
error: '.' トークンの前に未修飾の ID が必要です。
-
std::logic_error' のインスタンスを投げた後に呼び出された実行エラー終了 what(): basic_string::_S_const
-
エラー: ローカル変数 'res' に関連付けられたスタックメモリのアドレスが返された
-
C++ - 文字列クラス超詳細紹介
-
致命的なエラー LNK1169: 1つ以上の多重定義されたシンボルが見つかりました 解決策
-
const char*' から `char*' への変換が無効な場合の対処法
-
c++ 11 random ライブラリの簡単な使い方
-
C++11 ランダムライブラリ乱数
-
std::allocator<char>::~allocator()' への未定義の参照
-
C++ inet_pton, inet_ntop 関数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
c++ プログラミング プロンプトの関数定義はここでは許可されません。
-
C++ std::string は NULL で初期化できない、基本的な使い方
-
error: 'vector' does not name a type
-
34:5: エラー: 制御が非ボイド関数の終わりに達する可能性がある [-Werror,-Wreturn-type] エラー解析
-
ソースファイルをコンパイルするとDev C++のランタイムエラーが発生し、コンパイルできない
-
gcc/g++ コンパイル時のエラー解析で期待される型指定子の前に
-
警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
C/C++ におけるランダム関数 rand() および srand() の使用法
-
[エラー]'cout' はこのスコープで宣言されていません。