先看效果:
步驟1. 創建UE5工程
新建UE5的C 空白項目TestPicturePro,記得選擇C ,初學者包可以根據自己需要選擇是否勾選。
步驟2. 創建空白插件,命名為SimplePictureTools
插件創建成功後可以看到如下目錄:
步驟3. 創建的藍圖靜态方法類
C 文件夾下右擊,創建C 類
選擇藍圖靜态方法類,點擊下一步
修改文件文件夾路徑,我們這裡修改到新創建的插件文件夾下
技巧:選擇公共的話,UE會把頭文件放到public文件夾下面,cpp文件放到Private文件夾下面,如果選擇私有的話,UE會把頭文件 cpp文件都放到Private文件夾下面。
同樣創建成功後會出現
步驟4. 在SimplePictureToolsLibrary.h定義LoadImageToTexture2D方法
public:
UFUNCTION(BlueprintCallable, Category="Picture Tool")
static bool LoadImageToTexture2D(const FString& ImagePath, UTexture2D* &InTexture, float& Width, float& Height);
據說UTexture2D是一個指針,我們需要把他傳到藍圖中,所以需要添加引用&InTexture
在LoadImageToTexture2D方法中添加用于:取出ImagePath文件的二進制數據的代碼
// 取出ImagePath文件的二進制數據
TArray<uint8> ImageResultData;
FFileHelper::LoadFileToArray(ImageResultData,*ImagePath);
加載圖片處理模塊
// 加載圖片處理模塊
// 使用模塊管理器的帶有檢測功能的模塊加載方法LoadModuleChecked
IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>("ImageWrapper");
找到runtime下的ImageWrapper模塊的方法如下:
模塊名
并且要在TestPicturePro.Build.cs中添加模塊ImageWrapper。
根據不同的文件格式創建不同的文件處理類
TSharedPtr<IImageWrapper> ImageWrapper= ImageWrapperModule.CreateImageWrapper(EImageFormat::BMP);
UE目前支持的格式如下:
enum class EImageFormat : int8
{
/** Invalid or unrecognized format. */
Invalid = -1,
/** Portable Network Graphics. */
PNG = 0,
/** Joint Photographic Experts Group. */
JPEG,
/** Single channel JPEG. */
GrayscaleJPEG,
/** Windows Bitmap. */
BMP,
/** Windows Icon resource. */
ICO,
/** OpenEXR (HDR) image File format. */
EXR,
/** Mac icon. */
ICNS,
/** Truevision TGA / TARGA */
TGA,
/** Hdr file from radiance using RGBE */
HDR,
/** Tag Image File Format files */
TIFF,
};
判斷傳進來的文件格式,獲取文件名後綴,判斷文件格式,并且傳給圖片處理類
//獲取文件名後綴,判斷文件格式
FString Ex =FPaths::GetExtension(ImagePath,false);
EImageFormat ImageFormat = EImageFormat::Invalid;
if (Ex.Equals(TEXT("jpg"),ESearchCase::IgnoreCase)
|| Ex.Equals(TEXT("jpeg"),ESearchCase::IgnoreCase))
{
ImageFormat = EImageFormat::JPEG;
}
else if(Ex.Equals(TEXT("png"),ESearchCase::IgnoreCase))
{
ImageFormat = EImageFormat::PNG;
}
else if(Ex.Equals(TEXT("bmp"),ESearchCase::IgnoreCase))
{
ImageFormat = EImageFormat::BMP;
}
// 加載圖片處理模塊
// 使用模塊管理器的帶有檢測功能的模塊加載方法LoadModuleChecked
IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>("ImageWrapper");
// 根據不同文件格式創建不同的文件處理類
TSharedPtr<IImageWrapper> ImageWrapper= ImageWrapperModule.CreateImageWrapper(ImageFormat);
根據壓縮文件,解析圖片
// 根據壓縮文件,解析圖片
if (ImageWrapperPtr.IsValid()
&& ImageWrapperPtr->SetCompressed(ImageResultData.GetData(),ImageResultData.Num()))
{
}
内存分配的時候
,也可以把ImageResultDataNum()換成ImageResultData.GetAllocatedSize()
接下來去獲取BGRA的顔色數據
TArray<uint8> OutRawData; // 此數據跟格式無關
ImageWrapperPtr->GetRaw(ERGBFormat::BGRA, 8,OutRawData);
最後把顔色數據拷貝到需要的貼圖中
// 最後把顔色數據拷貝到需要的貼圖中
Width = ImageWrapperPtr->GetWidth();
Height = ImageWrapperPtr->GetHeight();
InTexture = UTexture2D::CreateTransient(Width,Height, PF_B8G8R8A8);
if (InTexture)
{
//數據拷貝時候,如果是多線程的話,不加鎖可能會引起崩潰哦
// 加鎖,LOCK_READ_WRITE可讀可寫
void* TextureData = InTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
// 賦值,把OutRawData顔色數據賦值給到InTexture
FMemory::Memcpy(TextureData, OutRawData.GetData(), OutRawData.Num());
//解鎖
InTexture->PlatformData->Mips[0].BulkData.Unlock();
// 刷新資源
InTexture->UpdateResource();
return true;
}
到此,LoadImageToTexture2D函數功能已經寫完,編譯運行
步驟5. 創建UI進行測試
創建4個按鈕,用來分别測試不同圖片
使用藍圖定義函數BP_LoadImageToTexture2D,定義4個按鈕事件,分别調用BP_LoadImageToTexture2D測試JPG,PNG,BMP等圖片
好了,最近這一節這麼多了,大家課後自己嘗試其他類型圖片,希望今天的内容對你有所幫助! 最後效果如下:
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!