Play Siv3D!

ゲームとメディアアートのための C++ ライブラリ「Siv3D」

QR コード

QR コード

Siv3D June 2015 v2

データを QR コードで表現するのに必要な最小限のバージョンを計算
QR::MinimumVersion() にデータを渡すとデータを表現できる最小限のバージョン(セルの数に対応)を取得できます。

# include <Siv3D.hpp>

void Main()
{
	if (const auto version = QR::MinimumVersion(L"Siv3D", QREncodingMode::Binary, QRECLevel::Low))
	{
		Println(version.value());
	}

	WaitKey();
}


データを QR コードに変換する
QR::Encode() にデータを渡すと QR コードの Image を生成できるようになりました。
関数が返す Image は白黒の 1 ドットが 1 ピクセルで表現されています。
Image::scaled() で適当な大きさに拡大し、カメラで検出できるよう Imaging::bordered() で白い枠を付けてください。

# include <Siv3D.hpp>

void Main()
{
	const Image image = QR::Enccode(L"Siv3D")
		.scaled(10.0, Interpolation::Nearest)
		.bordered(20);

	const Texture texture(image);

	while (System::Update())
	{
		texture.draw();
	}
}


QR コードを検出してデータを復号する
画像を QR::Decode に渡すと、画像内にQR コードが検出された場合、その情報を QRData 型に保存します。

# include <Siv3D.hpp>

void Main()
{
	if (!Webcam::Start(0))
	{
		return;
	}

	Image image;
	DynamicTexture texture;

	while (System::Update())
	{
		if (Webcam::HasNewFrame())
		{
			Webcam::GetFrame(image);

			texture.fill(image);

			QRData data;

			if (QR::Decode(image, data))
			{
				switch (data.mode)
				{
				case QREncodingMode::Numeric:
					Println(L"Numeric: ", data.text);
					break;
				case QREncodingMode::Alnum:
					Println(L"Alnum: ", data.text);
					break;
				case QREncodingMode::Kanji:
					Println(L"Kanji: ", data.text);
					break;
				case QREncodingMode::Binary:
					std::string binary;
					binary.resize(data.reader.size());
					data.reader.read(&binary[0], data.reader.size());
					Println(L"Binary: ", data.reader.asArray());
					Println(L"(Widen): ", Widen(binary));
					Println(L"(UTF8): ", FromUTF8(binary));
					break;
				}		
			}
		}

		if (texture)
		{
			texture.draw();
		}
	}
}