当前位置: 首页> 游戏> 单机 > UE C++ 插件读取图片(二)

UE C++ 插件读取图片(二)

时间:2025/7/19 10:48:31来源:https://blog.csdn.net/m0_64217692/article/details/141901712 浏览次数:0次

一. 创建静态函数

public:static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath);  //智能指针,方便追寻引用C++,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& ImagePath, bool& IsValid, int32& OutWidth, int32& OutHeight);	//加Const 为输入参数 ,不加为输出参数

上篇文章(一)有函数,通过传入路径的文件格式,依据尾部的信息,不同的文件格式的图片的ImageWrapper。

ImageWrapper是所有图片类型的抽象层,其设计思路如下:

图片文件数据是经过压缩的数据,称为CompressedData;
图片文件对应的原始RGBA数据是没有压缩的,且与图片格式无关,称为RawData;
不同格式的同样图片,其RawData不变,CompressedData随格式而变;
所有图片格式都可以抽象为一个CompressedData与RawData的组合。

2.然后写的函数,将外部图片变为UTexture。首先判断平台里这个图片是否存在。

 通过文件路径,去加载图片。如果想要使用

FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath)

则需要这些头文件,在CPP中:

#include "Misc/FileHelper.h"   //文件相关的头文件#include "Misc/Paths.h" // 路径相关头文件 //上面两个在其它读取文件也常用到#include "Modules/ModuleManager.h" //模块相关头文件#include "HAL/PlatformFileManager.h"  //平台相关的头文件

LoadTexture2D 中先判断文件 并读取文件压缩到容器中。

	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath)) //判断文件是否存在{return nullptr;  //如果不存在 就返回空}TArray<uint8>CompressData;   //填充压缩数据 的容器if (!FFileHelper::LoadFileToArray(CompressData,*ImagePath))  //读取文件{return nullptr;}

然后用上篇文章的 获得 对应的ImapeWrapper。

TSharedPtr<IImageWrapper>ImageWrapper = GetImageWrapperByExtention(ImagePath);

填充压缩数据 到 容器中,声明数组装填RGB的:

图片的加载过程先通过SetCompressed将二进制文件转化为BGRA的数据,然后通过GetRaw()函数提取到数组里面赋值给Texture2D,然后通过CreateTransient创建图片信息数据。最后填充PlatformData的Mip资源,加载图片。

if (ImageWrapper.IsValid()&&ImageWrapper->SetCompressed(CompressData.GetData(),CompressData.Num()))
{TArray<uint8>UnCompressedDataRGBA;   //存储未压缩的颜色数据,UE4用的颜色格式为BGRAif (ImageWrapper->GetRaw(ERGBFormat::BGRA,8, UnCompressedDataRGBA)) //获取未压缩的图片颜色信息,位深度为8,判断是否填充正确{Texture = UTexture2D::CreateTransient(int32(ImageWrapper->GetWidth()),int32(ImageWrapper->GetHeight())); //图片宽和高给到Texture,临时填充if (Texture != nullptr)	{IsValid = true;OutWidth = ImageWrapper->GetWidth();OutHeight = ImageWrapper->GetHeight();		////输出到Texturevoid* TextureData = Texture->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);	  //获取平台数据填充,可读可写用自带方法"PlatformData"让Texture和指针TextureData绑定(Lock)并且可读可写,因为下一行的复制函数中的参数要求为void*FMemory::Memcpy(TextureData,UnCompressedDataRGBA.GetData(),UnCompressedDataRGBA.Num());   //复制未压缩的颜色数据,内存中写入数据Texture->GetPlatformData()->Mips[0].BulkData.Unlock();                                    //获取平台数据解锁,将指针和Texture解绑(unlock)Texture->UpdateResource();  //更新平台资源,刷新}}
}
return Texture;   

关键字:UE C++ 插件读取图片(二)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: