当前位置: 首页 > news >正文

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道,一用就报错。

	static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath);  //智能指针,方便追寻引用C++,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& ImagePath,bool &IsValid,int32& OutWidth,int32& OutHeight);	//加Const 为输入参数 ,不加为输出参数static void GetTextureFullNamesByPath(TArray<FString>&FileNames,const FString Path,EImageType ImageType);UFUNCTION(BlueprintCallable,Category = "GWX|TextureReader")static void GetTextureByPath(TArray<FTextureDetail>&Textures,FString FilePath,EImageType ImageType = EImageType::PNG);

GetTextureByPath 可以在关卡蓝图里被调用。但如果没有static,在关卡蓝图就调用不了。

C++ 插件开发

  • 创建函数库插件 配置模块创建变量

1.打开Plugins,点击左上角Add添加

2.这次我们选择创建蓝图库,方便蓝图中进行调取。插件启动时,注册运行这个模块。

3.ImageWrapper图像总的模块类。Core,UMG。

3.在TextureReaderBPLibrary.h里,添加需要使用的头文件。

#include "IImageWrapper.h"      //图像信息的方法#include "IImageWrapperModule.h"   //图片相关信息的模块#include "Engine/Texture2D.h"#include "CoreMinimal.h"   //#include "Kismet/BlueprintFunctionLibrary.h"

4.接着创建两个枚举。用于图片类型,路径类型。UMETA 别名

UENUM(BlueprintType)
enum class EImageType :uint8
{JPG UMETA(DisplayName = "JPG"),PNG UMETA(DisplayName = "PNG"),BMP UMETA(DisplayName = "BMP"),TIFF UMETA(DisplayName = "TIFF")
};UENUM(BlueprintType)
enum class EPathType :uint8
{ABSOLUTE UMETA(DisplayName = "ABSOLUTE"),RELATIVE UMETA(DisplayName = "RELATIVE")
};

5.结构体用于区分,每个图片的具体信息。结构体名称不仅要F开头,而且要像个UE的类一样声明如下,可读可写。图片高和宽。

USTRUCT(BlueprintType)  //F开头struct FTextureDetail{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "ZGD|TextureReader")UTexture2D* Texture;UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "ZGD|TextureReader")int32 Width;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "ZGD|TextureReader")int32 Height;};

6.先声明需要这些,参数方法。在BlueprintLibrary中用static全局函数,这样在蓝图中可以直接去调用非常方便。智能指针,虚幻底层包含原生C++,智能指针可以包裹原生C++。在虚幻进行 引用计数 和 垃圾回收 很方便追寻,并且平台融合很好。

UCLASS()class UTetureReaderBPLibrary : public UBlueprintFunctionLibrary{GENERATED_UCLASS_BODY()UFUNCTION(BlueprintCallable, meta = (DisplayName = "Execute Sample function", Keywords = "TetureReader sample test testing"), Category = "TetureReaderTesting")static float TetureReaderSampleFunction(float Param);   //自带的静态public:static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath);  //智能指针,方便追寻引用C++,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& ImagePath, bool& IsValid, int32& OutWidth, int32& OutHeight); //加Const 为输入参数 ,不加为输出参数};

7.图片加载,加载模块ImageWrapper(build.cs里添加的模块)。判断尾部,在返回对应的相关信息。

TSharedPtr<IImageWrapper> UTetureReaderBPLibrary::GetImageWrapperByExtention(const FString InImagePath)
{IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));  //找到ImageWrapper这个模块if (InImagePath.EndsWith(".png")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);}else if (InImagePath.EndsWith(".jpg")||InImagePath.EndsWith(".jpeg")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);}else if (InImagePath.EndsWith(".bmp")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::BMP);}else if (InImagePath.EndsWith(".ico")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::ICO);}else if (InImagePath.EndsWith(".exr")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::EXR);}else if (InImagePath.EndsWith(".icns")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::ICNS);}else if (InImagePath.EndsWith(".tiff")){return ImageWrapperModule.CreateImageWrapper(EImageFormat::TIFF);}return nullptr;
}

后续开始写第蓝图调用读取图片的函数。

相关文章:

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …...

C语言行地址列地址区别,内存的分配

开辟了10个字节的空间在栈中 "abc"常量在代码段 char a[10]"abc"; p&#xff1a;8个字节存"abc"的地址 "abc"常量在代码段中 char *p"abc" char *q"abc" p,q的值是一样的 到…...

Unity 一键修改图片缩放保存为当前的一半大小

用来压缩贴图大小还是比较方便的 支持 png,jpg,tga 话不多说 直接上代码 [MenuItem("Assets/扩展功能/缩放贴图一半尺寸&#xff08;png | jpg | tga&#xff09;", false)]static void ScaleHalfTextureSizeMenu(){foreach(var obj in Selection.objects) {Texture…...

Identifying User Goals from UI Trajectories论文学习

通过UI轨迹识别用户的需求。 这篇论文同样聚焦于UI agent&#xff0c;只是思路比较特别。他们想要通过训练agent通过用户的行为轨迹反推出他们想要干什么的能力来锻炼agent识别&#xff0c;理解&#xff0c;使用UI的能力。同时这个训练项目本身也有一定的实际意义&#xff0c;…...

[STM32]从零开始的STM32标准库环境搭建(小白向)

一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解&#xff0c;相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发&#xff0c;基于ST官方的标准库开发&#xff0c;基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…...

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误&#xff0c;这给本地调试造成了极大的不便&#xff0c;在被这个问题困扰了多日以后&#xff0c;终于在GitHub上找到答案 基于这个 帖子 &#xff0c;有一个回复 他写了一个帮助类&#xff0c;专门用来调试本地的API&#xff0c;…...

助贷CRM系统:为金融中介行业打造全新营销管理模式

助贷CRM&#xff08;客户关系管理&#xff09;系统是针对金融中介行业&#xff0c;特别是从事贷款助贷业务的机构设计的一套综合管理系统。该系统旨在通过数字化、智能化的手段&#xff0c;优化金融中介机构的营销、销售、客户管理及服务流程&#xff0c;提升运营效率&#xff…...

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…...

使用Fign进行客户端远程调用和SpringFormEncoder的使用

1、引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2、启动类加上注解 EnableFeignClients SpringBootApplication public class FeignTe…...

golang 数据库使用注意事项

1.在使用 fmt.Sprintf 构建 SQL 插入语句时&#xff0c;参数包含特殊符号&#xff08;如引号 、分号 ;、反斜杠 \ 等&#xff09;&#xff0c;可能会导致 SQL 注入或插入失败的问题。为了解决这个问题&#xff0c;推荐使用占位符&#xff08;如 $1, $2, 等&#xff09;和参数化…...

Leetcode面试经典150题-221.最大正方形

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题一看就是典型的动态规划&#xff0c;要找以每个点为右下角的正方形的面积&#xff0c;然后取最大的这个题要注意找规律&#xff0c;我找到的规律如下&#xff1a;1.以第一行为右下角的&#xff0c;因为正…...

51单片机-DS1302,操作简述

DS1302的命令字&#xff08;Command Byte&#xff09;是由控制DS1302芯片的主机&#xff08;通常是单片机&#xff0c;如51单片机&#xff09;来生成和发送的。DS1302是一款实时时钟&#xff08;RTC&#xff09;芯片&#xff0c;它通过串行通讯接口与单片机进行数据交换。 DS1…...

Vue3+Vite+Echarts 出现Missing semicolon错误

使用的echarts代码如下: import * as echarts from echarts;type EChartsOption echarts.EChartsOption;var chartDom document.getElementById(main)!; var myChart echarts.init(chartDom); var option: EChartsOption;option {series: [{type: gauge,center: [50%, 6…...

iOS——frame和bounds的区别

把frame理解为占用区域&#xff0c;把bounds理解为边界。View在旋转过程中&#xff0c;其实自己的坐标系统并没有发生改变&#xff0c;bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…...

Trm理论 3(注意力机制)

注意力机制&#xff08;attention&#xff09; 在使用LSTM&#xff0c;CNN等模型的时候&#xff0c;很难决定对于一个信息什么是重要的&#xff0c;什么是不重要的。因此注意力机制就是为了优化这一问题 怎么做注意力机制 注意力机制包含&#xff0c;查询对象&#xff08;Q&…...

Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式

文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本&#xff1a; 使用 vue-cli 创建项目&#xff1a; npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…...

基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】选题背景【6】国内外技术发展现状【7】研究的目…...

spark读取csv文件

测试spark读取本地和hdfs文件 from pyspark.sql import SparkSessionspark SparkSession.builder \.appName("Example PySpark Script") \.getOrCreate()# 读取本地csv文件 df spark.read.csv("/Users/xiaokkk/Desktop/local_projects/spark/intents.csv&quo…...

钢铁百科:Q420DR力学性能、Q420DR执行标准、Q420DR低温容器钢板

Q420DR钢板是一种专为低温压力容器设计的优质钢材&#xff0c;其材质特性、执行标准、化学成分、力学性能、交货状态、应用范围以及常用规格等方面都具有显著的特点。 一、Q420DR钢板材质 Q420DR钢板的命名方式体现了其材质特性。其中&#xff0c;“Q”代表屈服强度&#xff…...

三菱机器人手柄维修示教器维修手操器面板等

机器人手柄维修&#xff08;示教器维修&#xff09;故障现象包括&#xff1a;黑屏、指示灯无任何显示&#xff0c; 上电蓝屏、白屏&#xff0c;通电几分钟后屏幕变为蓝屏&#xff0c;主板故障&#xff0c;通讯时有时无&#xff0c; 触摸失灵&#xff0c;有时白屏&#xff0c;触…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...