范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

虚幻引擎QR二维码的生成与显示含源码

  这一周我们花了很多时间研究Askutron。由于虚幻引擎对我来说还很新,我每天都在学习。这篇短文是关于我如何弄清楚如何生成和显示QR码。
  如果你想节省时间,你可以试试虚幻商城上任何二维码插件的运气。但这些插件普遍缺乏评论,同时作为程序员的骄傲阻止了我抛出50欧元。
  下面是我的研究步骤: 计算二维码 在运行时从 QR 码生成纹理 使用图像在 UI 中显示该纹理 1、计算二维码
  就像你可能期望的那样,我的旅程始于网络搜索"C++QR code"。第一个结果得出了这样的结果:
  事实上,这个拥有1600颗星的GitHub仓库从一开始就看起来很有希望。此外,文档简明扼要,重要的是,包含简单的示例。
  因此,我继续漫不经心地将CPP文件(QrCode.hpp和QrCode.cpp)复制到虚幻项目的代码文件夹中。这对我来说总是关键时刻。它会编译吗?或者,我将不得不在神秘的C++错误消息上撕掉我的头发。幸运的是,它编译没有任何问题。
  按照网站上的例子和一些基本的虚幻C++知识,计算QR码就像馅饼一样简单: UTexture2D* UWebBuzzers::GenerateQrCode(UObject* parent, FString string) {         auto errorCorrectionLevel = qrcodegen::QrCode::Ecc::LOW;     qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(TCHAR_TO_UTF8(*string), errorCorrectionLevel);      uint8 size = qr.getSize();     TArray pixels;     pixels.SetNumZeroed(size * size);      FColor black = FColor::Black;     FColor white = FColor::White;      for (uint8 x = 0; x < size; x++)     {         for (uint8 y = 0; y < size; y++)         {             FColor color = qr.getModule(x, y) ? white : black;             pixels[x + y * size] = color;         }     }      // TODO: Generate texture from color array (see below) }
  实际的QR计算发生在对 encodeText 的一次调用中。请注意,我选择简单地使用低纠错级别,这使得QR码更小。这是因为在屏幕上显示QR码不太可能受到障碍物或失真的太大影响。
  这非常简单直观。向Nayuki致敬,为这个伟大的库而欢呼! 2、在运行时从 QR 码生成纹理
  下一步是将该颜色数组转换为可以显示的纹理。这甚至更简单,至少在一开始是这样:     FCreateTexture2DParameters params;         UTexture2D* texture = FImageUtils::CreateTexture2D(size, size, pixels, parent, "QRCode", EObjectFlags::RF_Transient, params);      // don"t interpolate texels to get sharp edges (otherwise the image would look blurry)     texture->Filter = TextureFilter::TF_Nearest;
  我正在使用FImageUtils: CreateTexture2D在运行时生成纹理。它的文档 极度 缺少示例代码,就像整个虚幻文档一样。但我最终想出了一组有效的参数: 前两个参数只是以像素为单位的大小,我简单将其设置为QR码的大小("模组"的数量) 像素是上面的 FColor 数组 parent是任何可以传入的 UObject对象,例如通过蓝图。这很重要!如果没有设置 parent,纹理将立即被垃圾回收,或者至少我认为这是正在发生的事情。不设置它将导致编辑器崩溃并出现诸如"对象未打包"之类的错误。 QRCode是纹理的名称,可以自由选择 对于 flags,我不太确定这里需要传递什么。但根据稀疏的文档 我选择RF_Transient - "不保存对象",因为纹理只应该在运行时存在。 最后一个参数 params 允许更改其他一些我什么都不知道的选项,所以我将它们保留为默认值。
  将纹理滤镜设置为 NEAREST(最近邻插值)也很重要。默认滤镜在像素之间使用某种插值,这意味着当纹理被拉伸时,它会变得非常非常模糊。生成的纹理大小仅在 17×17 和 144×144 像素之间,具体取决于编码字符串的长度和纠错级别。
  在编辑器中完美运行。我们完成了,对吧?恐怕不是。虽然此代码在编辑器中按预期运行,但它实际上会在打包的构建中崩溃,并出现以下错误:"控制台不支持构造texture2D",正如我刚刚发现的那样。
  这个解决方案并不漂亮,虚幻的文档再次毫无帮助。所以回到网络搜索。不幸的是,论坛或"AnswerHub"上关于虚幻引擎的许多问题都没有得到解答。Unity社区似乎处于更好的状态。无论如何,我最终找到了一个带有解决方案的帖子(尽管没有解释):     UTexture2D* texture = UTexture2D::CreateTransient(size, size, EPixelFormat::PF_B8G8R8A8, "QRCode");     void* data = texture->PlatformData->Mips[0].BulkData.Lock(LOCK_WRITE);     FMemory::Memcpy(data, pixels.GetData(), size * size * 4);     texture->PlatformData->Mips[0].BulkData.Unlock();     texture->UpdateResource();
  作为一个之前使用DirectX和OpenGL编写C++程序的人,对于"控制台"不支持初始解决方案这个问题,我依然没有任何线索,。也许是因为非方形的纹理大小,但我懒得去测试这个理论。
  无论如何,这是最终代码(另请参阅此Gist): #include "QrCode.hpp" // from https://github.com/nayuki/QR-Code-generator #include "ImageUtils.h" // from Unreal Engine (4.24)  /// Generates a QR code texture from a string. /// UE parent (required) /// String to encode UTexture2D* UWebBuzzers::GenerateQrCode(UObject* parent, FString string) {         qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(TCHAR_TO_UTF8(*string), qrcodegen::QrCode::Ecc::LOW);      uint8 size = qr.getSize();     TArray pixels;     pixels.SetNumZeroed(size * size);      FColor black = FColor::Black;     FColor white = FColor::White;      for (uint8 x = 0; x < size; x++)     {         for (uint8 y = 0; y < size; y++)         {             FColor color = qr.getModule(x, y) ? white : black;             pixels[x + y * size] = color;         }     }      UTexture2D* texture = UTexture2D::CreateTransient(size, size, EPixelFormat::PF_B8G8R8A8, "QRCode");     void* data = texture->PlatformData->Mips[0].BulkData.Lock(LOCK_WRITE);     FMemory::Memcpy(data, pixels.GetData(), size * size * 4);     texture->PlatformData->Mips[0].BulkData.Unlock();     texture->UpdateResource();      texture->Filter = TextureFilter::TF_Nearest;      return texture; }
  我在这里没有展示的是,我将此函数作为蓝图代码库的一部分公开。如何做到这一点,我不打算在这里介绍,因为这是一种标准的虚幻的东西,应该被文档所涵盖。 3. 使用Image在 UI 中显示该纹理
  要在UI中显示生成的QR码纹理,只需抓取图像,从上面调用蓝图函数,并使用"从纹理设置画笔"将结果设置为图像的纹理。
  大功告成!这就是你在虚幻引擎中生成和显示QR码的方式,就像一个对虚幻引擎几乎一无所知的人一样。如果有一天我学会了更好的方法来做到这一点,我会确保更新这篇文章。
  原文链接:http://www.bimant.com/blog/ue4-qrcode/

张译领衔,吴刚助阵,倪大红出山,狂飙或成扫黑剧天花板9月,平台和卫视的招商大会纷纷来袭,前段时间浙江卫视刚在招商会上公布了自个儿接下来待播剧目,有陈宝国领衔全明星阵容的大考,有正午阳光再次联手胡歌的县委大院,还有一线顶流小花迪丽热巴母亲的凉面条岁月悠悠年磊又到了三伏天,酷暑难耐,每逢到吃饭的时间,总是没有胃口。此时,遥忆儿时,很想吃母亲做的凉面条。那时兄弟姐妹五人,都尚小,盛夏中午,母亲从田地里干活回来,我们便像雏鸟般飞洋河的好日子来了1洋河二季度营收达到了创纪录的58。81亿,经过近两年的调整,有一种重回巅峰的感觉。二季度扣非净利润同样达到了创纪录的17。45亿元,在一季度取得历史最好的营收和利润后再创佳绩,可东安晒秋晒出红火好日子红网时刻新闻9月13日讯(通讯员涂群华谢助民)连日来,天气晴好,东安县大地五谷收割登场,舜管局塘家村塘家梯田,禾好谷黄,田间机声轰鸣,一派丰收景象,吸引了大批游客前来游玩。村民游客他16岁瞒着父母参加红军,18年后成副司令返乡,母亲长官你找谁引言1947年的某一天,一个穿着解放军军装的战士来到湖北黄安县。在众人疑惑的目光当中,他来到一户破败的茅草屋前。犹豫了许久之后,他才终于下定决心敲响房门。看到一位白发苍苍的老妇人打iPhone14ProMax机身拆解灵动岛的秘密都藏在这苹果自从9月8日正式发布iPhone14系列以来,各位果粉都在翘首以盼新机正式开卖。而9月16日将是iPhone14系列首卖日,这天果粉们也会在第一时间拿到预售的新iPhone。而魔兽怀旧TBC希尔斯布莱德情怀装备TOP5,蓝色戒指真心极品魔兽世界一大傻,兽人术士皮皮侠。大家好,我是不爱皮皮虾爱装备的魔兽大傻皮皮侠!今天大傻皮皮侠来和大家分享下TBC经典副本希尔斯布莱德丘陵情怀装备,跟着我游动起来吧!一闪光奥金指环别提前激活iPhone14每台罚款20万经销商直播演示灵动岛驱动中国2022年14日消息,目前,iPhone14系列已开启预售,并将于9月16日正式发售。据苹果官方报道,若在9月16日早8点前开机激活,如果经销商提前激活iPhone14Pr安卓手机也能用上灵动岛?酷安上线灵动鸟APP今年iPhone14系列最让人印象深刻的莫过于灵动岛设计,这几天也有不少网友议论,安卓手机为什么不能拥有这样灵动的动画呢?你别说,好像还真可以!今日,酷安上架了一款名为灵动鸟的apiPhone14最火的灵动岛功能,安卓也有了北京时间9月8日凌晨,苹果秋季发布会上正式发布了iPhone14系列手机!也许是之前配置规格等信息被曝光的差不多了的原因,没想到本次发布会上最让人惊艳的居然是一个软件功能灵动岛,很夜读丨君子如兰,佳友如你作者丨渡兰君主播丨青瑶人这一生会遇到无数人,可拥有几个朋友,却总也数不清有些人,你不知道算不算朋友。看着酒肉朋友成群,却不知谁才是陪到最后的君。朋友不贵多,只贵知心,如果朋友有品质
大衣围巾毫不费力的时髦,今冬这样穿,温暖又好看嗨,各位小仙女们,大家好呀!在冬日里穿大衣,又怎能缺少了围巾的点缀呢?特别是出门在外的时候,寒风习习,想要温度又不失时髦感,适当利用起一些配饰来点缀,是很不错的选择!大衣围巾,毫不这法子可真牛,法令纹说没就没了俗话说得好,爱笑的女孩运气总不会太差,这句话究竟有没有道理我不知道,但可以肯定的是,爱笑的女孩法令纹一定不会很淡!法令纹是女人显老的初期表现,而且随着年龄的增长,法令纹也会随之加深本来呢,想今年咸鱼翻身的,结果,糊锅了01hr记得年初我咬牙对自己说今年一定要咸鱼翻身要让事业和生活更上一层楼结果我这条咸鱼不但没能翻身还糊锅了02hr对工作要凭感情有了感情加起班来就不觉得累了就像我要不是对工资的那点在低谷时,切忌妄动在低谷时,切忌妄动其实一直在说,人的一生是有高有低的。像你顺的时候,好像闭着眼睛睡着觉钱就来了,但是你不走运的时候,真的就像掉进个枯井,怎么挣扎都好像没有用。说到易里的潜龙勿用,只多点快乐人的一生,其实是一场战斗,一场与自己精神的角逐。有言人是要有一点精神的。这个精神,就是人的正向能量,一旦充分激活,潜力巨大,带给人的就是一往无前战无不胜。只是日常,我们常常被一些负理解别人,也是成全自己永远不要轻易讨厌一个人在网上看到这样一张漫画。一个人从门缝里看人,却责怪别人长得扁。生活中,我们常常因为一件事一句话,而讨厌一个人。但其实,未必是别人的错,也可能是你看到的不是事物的全貌。放下心中的成见C罗未婚妻带4娃闪耀世界杯!裹得严实瞬间变高级,还见卡塔尔太后C罗未婚妻乔治娜带着4个孩子去了卡塔尔世界杯,而当地时间周五,乔治娜在世界杯的首秀穿得好严实,和她平时的性感夸张风格大不同。不过葡萄牙和韩国的比拼中,输给了韩国,乔治娜带着4个孩子杨旭连线权敬源我没踢过世界杯,你帮我进一个球吧在韩国队21逆转葡萄牙,以小组第2晋级世界杯16强赛之后,权敬源在权健时的队友杨旭与其进行了连线。杨旭恭喜权敬源进入世界杯16强,同时希望权敬源能帮他圆梦,在世界杯赛场上进一个球。世界杯只有冷门,没有假球总有一些人,把超出自己意料以外的比赛,一律看成是假球,假球论在网上很是流行。西班牙输给了日本,葡萄牙输给了韩国,巴西输给了喀麦隆。这是不是听起来很诡异,很多人说,没想到堂堂正正的巴没人了?巴西伤兵满营,目前已有5名伤员,韩国球迷应该会窃喜截至目前,巴西共有5名伤员内马尔热苏斯桑德罗达尼洛特莱斯,热苏斯和特莱斯已经确定无缘世界杯后面的比赛了。而且其中大名单中4名边后卫伤了3个(达尼洛桑德罗特莱斯),仅剩39岁的阿尔维小组赛罢,四强呼之欲出,欧洲南美各占半壁江山小组赛罢,四强呼之欲出,欧美对抗大势已定小组赛最后一轮,战况令球迷大跌眼镜,强队纷纷落马,亚洲球队争相逆袭。我们肯定亚洲球队努力的同时,也需认识到,最后一轮比赛,对于一些强队来说,