一. 创建静态函数
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;