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

一. 创建静态函数

public:
	static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath);  //智能指针,方便追寻引用C++,加载ImageWrapper
	static 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用的颜色格式为BGRA
	if (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();		//
			//输出到Texture
			void* 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;   

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值