UE4插件-读取png图片

news2025/1/15 17:16:58

一、简介

在UE4中有多种类型的插件,适用于不同的场景。既可以放到引擎中还可以放到项目中,放到引擎中的插件可以被所有项目使用,放到项目中的插件只能被当前项目使用。插件的类型可以在【Edit】->【Plugins】->【New Plugin】中查看
在这里插入图片描述

二、创建插件

1.创建一个蓝图插件Blueprint Library命名:ReadImageBP,功能:读取图片并且显示在界面上显示出来
在这里插入图片描述
UReadImageBPBPLibrary 类中的代码参考网上的示例代码,并且加以修改
ReadImageBPBPLibrary.h

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "ReadImageBPBPLibrary.generated.h"

/*
*	Function library class.
*	Each function in it is expected to be static and represents blueprint node that can be called in any blueprint.
*
*	When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable.
*	BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins.
*	BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins.
*	DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu.
*				Its lets you name the node using characters not allowed in C++ function names.
*	CompactNodeTitle - the word(s) that appear on the node.
*	Keywords -	the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu.
*				Good example is "Print String" node which you can find also by using keyword "log".
*	Category -	the category your node will be under in the Blueprint drop-down menu.
*
*	For more info on custom blueprint nodes visit documentation:
*	https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation
*/
UCLASS()
class UReadImageBPBPLibrary : public UBlueprintFunctionLibrary {
	GENERATED_UCLASS_BODY()

	UFUNCTION(BlueprintCallable, meta = (DisplayName = "Execute Sample function", Keywords = "ReadImageBP sample test testing"), Category = "ReadImageBPTesting")
	static float ReadImageBPSampleFunction(float Param);

	//获取开发工程目录
	UFUNCTION(BlueprintCallable, Category = "Image")
	static FString getProjectDir();

	//获取打包之后的路径
	UFUNCTION(BlueprintCallable, Category = "Image")
	static FString getPakRootDir();


	UFUNCTION(BlueprintCallable, Category = "Image")
	static class UTexture2D* loadTexture2D(const FString path, bool&isValid, int32&outWidth, int32&outHeight);

private:
	static TArray<FColor> uint8ToFColor(const TArray<uint8> origin);
	static class UTexture2D* TextureFromImage(const int32 SrcWidth, const int32 SrcHeight, const TArray<FColor>& SrcData, const bool UseAlpha);
};

ReadImageBPBPLibrary.cpp

// Copyright Epic Games, Inc. All Rights Reserved.

#include "ReadImageBPBPLibrary.h"
#include "ReadImageBP.h"
#include "Engine/Texture2D.h"
#include "Core\Public\HAL\PlatformFilemanager.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"

UReadImageBPBPLibrary::UReadImageBPBPLibrary(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer) {

}

float UReadImageBPBPLibrary::ReadImageBPSampleFunction(float Param) {
	return Param;
}

FString UReadImageBPBPLibrary::getProjectDir() {
	FString dirPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());
	return dirPath;
}

FString UReadImageBPBPLibrary::getPakRootDir() {
	FString dirPath = FPaths::ConvertRelativePathToFull(FPaths::RootDir());
	return dirPath;
}

#pragma region TEXT("通过本地图片转换成UTexture2D")
UTexture2D* UReadImageBPBPLibrary::loadTexture2D(const FString path, bool& isValid, int32& outWidth, int32& outHeight) {
	UTexture2D* texture2D = nullptr;
	IImageWrapperModule& imageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	IImageWrapperPtr imageWrapper = imageWrapperModule.CreateImageWrapper(EImageFormat::PNG);

	TArray<uint8> OutArray;
	if (FFileHelper::LoadFileToArray(OutArray, *path)) {
		if (imageWrapper.IsValid() &&
			imageWrapper->SetCompressed(OutArray.GetData(), OutArray.Num())) {
			TArray<uint8> uncompressedRGBA;
			if (imageWrapper->GetRaw(ERGBFormat::RGBA, 8, uncompressedRGBA)) {
				const TArray<FColor> uncompressedFColor = uint8ToFColor(uncompressedRGBA);
				outWidth = imageWrapper->GetWidth();
				outHeight = imageWrapper->GetHeight();
				texture2D = TextureFromImage(imageWrapper->GetWidth(), imageWrapper->GetHeight(), uncompressedFColor, true);
			}
		}
	}
	return texture2D;
}
#pragma endregion

#pragma region TEXT("将uint8数组转为颜色数组")
TArray<FColor> UReadImageBPBPLibrary::uint8ToFColor(const TArray<uint8> origin) {
	TArray<FColor> uncompressedFColor;
	uint8 auxOrigin;
	FColor auxDst;

	for (int i = 0; i < origin.Num(); i++) {
		auxOrigin = origin[i];
		auxDst.R = auxOrigin;
		i++;
		auxOrigin = origin[i];
		auxDst.G = auxOrigin;
		i++;
		auxOrigin = origin[i];
		auxDst.B = auxOrigin;
		i++;
		auxOrigin = origin[i];
		auxDst.A = auxOrigin;
		uncompressedFColor.Add(auxDst);
	}

	return  uncompressedFColor;

}
#pragma endregion

#pragma region TEXT("将颜色数组赋值给Texture")
UTexture2D* UReadImageBPBPLibrary::TextureFromImage(const int32 SrcWidth, const int32 SrcHeight, const TArray<FColor>& SrcData, const bool UseAlpha) {

	// 创建Texture2D纹理
	UTexture2D* MyScreenshot = UTexture2D::CreateTransient(SrcWidth, SrcHeight, PF_B8G8R8A8);

	// 锁住他的数据,以便修改
	uint8* MipData = static_cast<uint8*>(MyScreenshot->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE));

	// 创建纹理数据
	uint8* DestPtr = NULL;
	const FColor* SrcPtr = NULL;
	for (int32 y = 0; y < SrcHeight; y++) {
		DestPtr = &MipData[(SrcHeight - 1 - y) * SrcWidth * sizeof(FColor)];
		SrcPtr = const_cast<FColor*>(&SrcData[(SrcHeight - 1 - y) * SrcWidth]);
		for (int32 x = 0; x < SrcWidth; x++) {
			*DestPtr++ = SrcPtr->B;
			*DestPtr++ = SrcPtr->G;
			*DestPtr++ = SrcPtr->R;
			if (UseAlpha) {
				*DestPtr++ = SrcPtr->A;
			} else {
				*DestPtr++ = 0xFF;
			}
			SrcPtr++;
		}
	}

	// 解锁纹理
	MyScreenshot->PlatformData->Mips[0].BulkData.Unlock();
	MyScreenshot->UpdateResource();

	return MyScreenshot;
}
#pragma endregion

修改ReadImageBP.uplugin文件

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "ReadImageBP",
	"Description": "",
	"Category": "AAA",
	"CreatedBy": "",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": false,
	"IsExperimentalVersion": false,
	"Installed": false,
	"Modules": [
		{
			"Name": "ReadImageBP",
			"Type": "Runtime",
			"LoadingPhase": "PreLoadingScreen",
			"WhitelistPlatforms": [
				"Win64"
			]
		}
	]
}
  1. 图片
    在Pingins下面新建一个文件夹Image,并且在里面添加一直图片
    在这里插入图片描述

  2. 使用插件功能
    在对应的插件文件夹下面,新建一个空的Actor,只有一个Box(触发盒子),新建一个UserWidget,在上面添加一个Image控件,当小白人走进Box的时候,就会调用插件中的函数加载图片,并且在HUD中的Image控件中显示出来
    在这里插入图片描述
    BP_TestReadImage
    在这里插入图片描述
    游戏一启动就把HUD添加到注游戏界面上
    在这里插入图片描述
    当游戏角色进入到触发盒子的时候,就会加载图片并且在Image控件上显示出来,图片路径写固定值/Iamge/2.png
    在这里插入图片描述
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    aaa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行

作者将狼才鲸创建日期2022-11-14 Gitee源码和工程地址&#xff1a;才鲸嵌入式 / 开源安防摄像机&#xff08;嵌入式软件&#xff09; CSDN文章地址&#xff1a;项目介绍&#xff1a;开源安防摄像机&#xff08;嵌入式软件&#xff09; 4&#xff09;完整的环境安装步骤 写在前…

软件产品测试的准入准出标准有哪些?

软件产品的测试并不是测试人员简单的执行测试过程便可以交付的&#xff0c;而是有着一定的标准&#xff0c;什么条件可以开始测试&#xff0c;什么时候结束测试等等也就是测试的准入准出标准。 一、软件测试的准入标准 1、开发人员编码结束并且已在开发环境中完成单元测试&a…

OpUtils局域网唤醒:远程引导计算机

局域网唤醒 &#xff08;LAN&#xff09;&#xff0c;通常称为 LAN 唤醒&#xff0c;是一种计算机网络标准&#xff0c;有助于远程启动有线和无线网络。也称为远程唤醒、LAN 唤醒、无线 LAN 唤醒或简称 WOL&#xff0c;LAN 唤醒技术可帮助网络管理员优化能源使用&#xff0c;并…

一文教你搞定Python如何自定义标准排序

文章目录1.字典自定义排序按照value排序按照key值排序先按照value降序&#xff0c;再按key升序2.多维列表自定义标准排序案例题目描述输入输出代码&#xff1a;1.字典自定义排序 按照value排序 sdict() s[a]45 s[b]44 s[c]78 s[d]34 asorted(s.items(),keylambda x:x[1],reve…

手摸手教你使用 Docker 快速搭建 Gitlab 服务

前言 Glitlab 比较占用内存&#xff0c;官方建议最低配置为 2核4G。我的服务器刚刚好是2核4G&#xff0c;但是还装了 Docker 跑一些其他服务&#xff0c;所以以防万一&#xff0c;还是选择在本地的虚拟机中进行安装。 如果你有一台配置较高的服务器那就更好了&#xff0c;一步…

nodejs+vue+elementui图书馆销售网上书城管理系统express228

目 录 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 下面我们讲解 1、 node_modules文…

【数据结构】队列详解 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

文章目录前言队列的概念队列的结构队列的实现结构设计接口总览初始化销毁入队列出队列取对头数据取队尾数据判空计算队列大小OJ题用队列实现栈用栈实现队列设计循环队列结语前言 今天的内容分为两大块&#xff1a;队列讲解 和 OJ题。队列讲解部分内容为&#xff1a;队列概念&a…

Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、卡片视图 随着手机越来越先进&#xff0c;开发者已经不满足简单地显示一张张图片&#xff0c;而要设计更多的花样&#xff0c;比如Android提供了一个卡片视图CardView&#xff0c;顾名思义它拥有卡片式的圆角边框&#xff…

[附源码]java毕业设计健身房管理系统论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度剖析 Vue3 如何通过虚拟DOM更新页面

上一讲我们主要介绍了 Vue 项目的首次渲染流程&#xff0c;在 mountComponent 中注册了effect 函数&#xff0c;这样&#xff0c;在组件数据有更新的时候&#xff0c;就会通知到组件的 update 方法进行更新 Vue 中组件更新的方式也是使用了响应式 虚拟 DOM 的方式&#xff0c…

git 命令行其实真的很好用

使用命令行操作git&#xff0c;我觉得是最简单、最直接的方式&#xff0c;最开始使用git的时候特别喜欢这种方式。后来&#xff0c;就不再使用命令行&#xff0c;而是选择了其他可视化的工具&#xff0c;如idea自带的插件、sourceTree、TortoiseGit、GitKraken。发生的转变的原…

AI绘画提示词创作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 深度学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/42 &#x1f4d8; 自然语言处理实战系列&#xff1a;https://www.showmeai.tech/tutorials/45 &#x1f4d8; 计算机视觉实战系列&#xff1a;h…

Jenkins 10 问 10 答,你想知道都在这

大家好啊&#xff0c;我是大田。 今天汇总一下近几周关于 Jenkins 问题。 1、如何安装 Jenkins&#xff1f; 答&#xff1a;一步一步教你安装部署 Jenkins&#xff0c;不信你安不上 2、忘记登录密码&#xff1f; 答&#xff1a;Jenkins 忘记登录密码解决办法 3、jenkins中缺少…

基于 IDEA 搭建 RocketMQ-4.6 源码环境

RocketMQ 架构 源码搭建前&#xff0c; 需要理解 RocketMQ 的四个重要组件&#xff0c; 以及 RocketMQ 的工作流程&#xff1a; NameServer是一个几乎无状态节点&#xff0c;可集群部署&#xff0c;节点之间无任何信息同步。 Broker部署相对复杂&#xff0c;Broker分为Master…

Java基础之《undertow容器》

一、什么是undertow 1、undertow是springboot默认支持的三种servlet容器之一。 tomcat、jetty、undertow 2、undertow怎么读 under-tow 3、undertow是RedHat&#xff08;红帽公司&#xff09;的开源产品&#xff0c;采用java开发&#xff0c;是一款灵活、高性能的web服务器&…

大学生游戏静态HTML网页设计-(北京冬奥会12页 带js 带视频 轮播图)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作方面上运用了html5和css3&#xff0c; 采用…

stack容器、queue容器(20221116)

一、stack容器 1、基本概念 先进后出的数据结构&#xff0c;只有一个出口&#xff08;栈顶&#xff09;。 栈不允许有遍历行为&#xff0c;可以判断是否为空(empty)&#xff0c;也可以知道其元素个数&#xff08;size&#xff09; 2、常用接口 构造函数&#xff1a; stac…

初始MySQL

目录 一、什么是数据库 二、SQL分类 三、库的操作 四、表的操作 五、数据类型 六、表的约束 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要有数据库&#xff1f; 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理 文件…

电脑视频怎么录制?好用的电脑录屏方法

在日常使用电脑的时候&#xff0c;很多小伙伴经常会遇到需要录制电脑视频的时候。但网上各种眼花缭乱的电脑录屏方法&#xff0c;很多小伙伴看了表示自己根本没有学会。今天就给大家分享2个简单好用的电脑录屏方法&#xff0c;看完后轻松掌握电脑录屏。 一&#xff0e;使用Wind…

主成分分析法在图像压缩和重建中的应用研究-含Matlab代码

目录一、引言二、主成分分析法概念及性质2.1 概念2.2 性质三、计算步骤3.1 计算相关系数矩阵3.2 计算特征值与特征向量3.3 计算主成分贡献率及累计贡献率3.4 计算主成分载荷3.5 各主成分的得分四、图像压缩与重建实验分析五、参考文献六、Matlab代码获取一、引言 主成分分析法…