前回まででプラグインの実装と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。
なぜデストラクタで例外が出るかは、がっつり調べないといけないのでいったん保留・・・・
(誰か教えて)
コメント