広告

ZxingをUE5.2で使えるようにしてみる(その3)(エディター専用)

前回まででプラグインの実装とC++に処理を記載するアクタークラスを定義したので、今回はC++にQRコードを読み込むプログラムを記載していきます。

Textureファイルから読み出し

プログラムの引数にTextureを指定して、TextureファイルからQRコードを読み出す処理です。
※UFUNCTIONなどの説明は省きます。

ヘッダーファイル

UFUNCTION(BlueprintCallable)
FString ReadTextureBarcodes(UTexture* texture);

ソースファイル

#include "../Library/Zxing/include/ZXing/ReadBarcode.h"
#include "../Library/Zxing/include/ZXing/DecodeHints.h"
/// <summary>
/// Textureファイルからバーコードを読み込む
/// </summary>
/// <param name="texture">テクスチャ</param>
/// <returns>読み込んだテキスト情報</returns>
FString ATestZxing::ReadTextureBarcodes(UTexture* texture)
{
	FString str = TEXT("");
	// 画像データ取得
	FImage image;
	if (texture != nullptr && texture->Source.GetMipImage(image, 0)) {
		//// 画像を作成
		ZXing::ImageView imageView(image.RawData.GetData(), image.GetWidth(), image.GetHeight(), ZXing::ImageFormat::BGRX);

		ZXing::DecodeHints hint;
		hint.setTextMode(ZXing::TextMode::HRI);
		hint.setEanAddOnSymbol(ZXing::EanAddOnSymbol::Read);
		//// リード
		ZXing::Result r = ZXing::ReadBarcode(imageView, hint);

		if (r.error().type() == ZXing::Error::Type::None) {
			std::string buff = r.text();
			str = buff.c_str();
		}
	}

	return str;
}

テクスチャからデータを配列で取得。ポインタとテクスチャのサイズを渡してReadBarcodeで読む感じっぽいです。
いったんstd::stringに移し替えているのは、直接渡すとデストラクタでエラーが発生するためです。
(原因不明)

とりあえずここまで出来たら一度UE側で読めるか確認します。

Actorの配置

今回テストで使うQRコードはこちら

これをUEの適当な場所にインポートします。

コンテンツブラウザなどから新規ブループリントを選択して

親クラス選択時に作ったアクタークラスを選択します。
検索ボックスに名前を入れれば出てくるはずです。

適当名前を設定してBPを作成し、

BPを編集して、先ほど作成したテクスチャを読み込む処理を呼び出します。

これでうまくいくと画面にURLが表示されるはずです。
(成功効率8割。ZXing::Resultのデストラクタで例外を吐くことがある。)

いったんはこれでOK。
なぜデストラクタで例外が出るかは、がっつり調べないといけないのでいったん保留・・・・
(誰か教えて)

コメント

タイトルとURLをコピーしました