LoginSignup
5
2

More than 1 year has passed since last update.

[C言語] QRコードエンコードをしてみる

Last updated at Posted at 2022-07-24

はじめに

今回QRコードをC言語でも扱ってみたいと考え様々なライブラリを探してきたが、便利なライブラリを見つけるのにくろうしたため、ここに記載をしていきたいと思う。

他のライブラリでは、openCVなどで画像まで作成してくれるが、今回は画像は作成しないで、自分で表示の処理をするところも記載していきたいと考える

スクリーンショット 2022-07-24 23.54.03.png

使用ライブラリ

今回ProjectNAYUKI様のQRコードエンコードライブラリを用いて開発をおこないました

ソースコード

出力方法としてはqr0をライブラリの関数に入れてFor文を回すことによって表示をすることができる。

qrencode.c

#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "qrcodegen.h"

//文字を設置する関数
void putWhite(){
    printf("\x1b[47m");     /* 背景色を白色に */
    printf(" ");
    printf("\x1b[49m");     /* 背景色をデフォルトに戻す */
}

void putBlack(){
    printf("\x1b[40m");     /* 背景色を黒色に */
    printf(" ");
    printf("\x1b[49m");     /* 背景色をデフォルトに戻す */
}

int main()
{
    //QRコード化する文字列を入力
    char str[1024];
    printf("\n> QRコード化したい文字を入力してください\n");
    scanf("%s", str);

    //QRコードの作成
    uint8_t qr0[qrcodegen_BUFFER_LEN_MAX];
    uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
    //第一引数に変換したい文字列を入れることによって配列を返すことができる
    //qr0によってデータを返してくれる。
    bool ok = qrcodegen_encodeText(str,
                                    tempBuffer, qr0, qrcodegen_Ecc_MEDIUM,
                                    qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX,
                                    qrcodegen_Mask_AUTO, true);
    if (!ok)
        return 0;



    //QRコードの大きさを取得
    int size = qrcodegen_getSize(qr0);

    //実際の出力の部分
    for (int y = 0; y < size; y++){

        for (int x = 0; x < size; x++){
            if (qrcodegen_getModule(qr0, x, y)){
					putBlack();
			}else{
					putWhite();
			}

        }
        printf("\n");
    }
   
}

使用方法

今回細かい調査は行っていないが、こうすればQRコードかした配列を取得できたという方法をまとめる。

ファイル構造

ファイル構造として、今回はこのような形になっている。

  • Makefile
  • 出力されたバイナリデータ
  • 実際に書いたコード
  • QRコードのライブラリ
  • QRコードのライブラリのヘッダファイル
    スクリーンショット 2022-07-24 23.29.49.png

エンコード方法

qrencode.c
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "qrcodegen.h"



int main()
{
    //QRコード化する文字列を入力
    char str[1024];
    printf("\n> QRコード化したい文字を入力してください\n");
    scanf("%s", str);

    //QRコードの作成
    uint8_t qr0[qrcodegen_BUFFER_LEN_MAX];
    uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
    //第一引数に変換したい文字列を入れることによって配列を返すことができる
    //qr0によってデータを返してくれる。
    bool ok = qrcodegen_encodeText(str,
                                    tempBuffer, qr0, qrcodegen_Ecc_MEDIUM,
                                    qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX,
                                    qrcodegen_Mask_AUTO, true);
    if (!ok)
        return 0;

   
}

出力方法

今回は文字列で "□" と "■" を表示する方法を使わないでコンソールの背景色を直接触ることによって作成することにした。
そうしないとうまくQRコードを表示できないためである。

コンソールの背景色を表示方法

consoleColer.c
#include <stdio.h>

//文字を設置する関数
void putWhite(){
    printf("\x1b[47m");     /* 背景色を白色に */
    printf(" ");
    printf("\x1b[49m");     /* 背景色をデフォルトに戻す */
}

void putBlack(){
    printf("\x1b[40m");     /* 背景色を黒色に */
    printf(" ");
    printf("\x1b[49m");     /* 背景色をデフォルトに戻す */
}

int main(){
    putWhite();
    printf("\n");

    putBlack();
    printf("\n");
}

出力結果としてはこのようなイメージになる
スクリーンショット 2022-07-24 23.43.54.png

より詳しい内容は下記URLよりご確認ください

コンパイル方法

今回はライブラリを用いて開発をしているため、一緒にライブラリもコンパイルする必要があるため、gccの記述を変える必要がある。

コマンドライン
> gcc qrencode.c qrcodegen.c

こうしないとうまくコンパイルされないで、関数が読み取れないエラーが発生してします。

また、いちいちこのような記載をするのはめんどくさいため、makefileを作成することとする

Makefile
CC=gcc
CFLAGS=-O

myqrencode: myqrencode.c
	$(CC) $(CFLAGS) -o myqrencode myqrencode.c qrcodegen.c -lncurses

こうすることによって、

コマンドライン
> make

とするだけでコンパイルができてしまうのである。
とても便利なため、ぜひ使ってみてほしい。

出力部分

出力する方法としては、[qrcodegen_getModule(qr0, x, y)]にxとy座標を与えると、その場所を黒に表示するか0,1で返されるので、あとはforとifを用いて表示をしていく

qrencode.c
//QRコードの大きさを取得
    int size = qrcodegen_getSize(qr0);

    for (int y = 0; y < size; y++){

        for (int x = 0; x < size; x++){
            if (qrcodegen_getModule(qr0, x, y)){
					putBlack();
			}else{
					putWhite();
			}

        }
        printf("\n");
    }

リリースについて

今回簡単にbrweにて配信をしたのでぜひダウンロードしてみてください。

> brew tap harutiro/myqrencode
> brew install myqrencode
> myqrencode

brewの公開方法をまとめたのでもしよければ見てみてください

Github

参考文献

QRコード関係

コンソールの色について

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2