讀取本地圖片

Dream_moon發表於2024-08-23

讀取本地圖片

程式碼實現

build.cs 新增 ImageWrapper 模組,使用時注意新增相關標頭檔案

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "ImageWrapper" });
  • 支援圖片型別

    • png
    • jpg
    • bmp
    • ico
    • exr
    • icns
  • 注意 jpg 讀取後 R 和 B 的通道位置

    • ERGBFormat::RGBAPF_R8G8B8A8ERGBFormat::BGRPF_B8G8R8A8

在虛幻引擎中,要將本地圖片轉換為 UTexture2D 型別,你可以使用以下步驟:

  1. 載入圖片檔案: 使用 FImageUtils::ImportFileAsTexture2D 函式或自定義載入函式將圖片檔案載入為 UTexture2D 物件。

  2. 示例程式碼

    cppCopy Code#include "ImageUtils.h"
    #include "Engine/Texture2D.h"
    
    UTexture2D* LoadImageAsTexture2D(const FString& FilePath)
    {
        TArray<uint8> ImageData;
        if (FFileHelper::LoadFileToArray(ImageData, *FilePath))
        {
            IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(TEXT("ImageWrapper"));
            TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG); // Assuming PNG format
            
            if (ImageWrapper->SetCompressed(ImageData.GetData(), ImageData.Num()))
            {
                TArray<uint8> UncompressedRGBA;
                if (ImageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))
                {
                    UTexture2D* Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight());
                    if (Texture)
                    {
                        void* TextureData = Texture->PlatformData->Mips[0].BulkData.GetAllocation();
                        FMemory::Memcpy(TextureData, UncompressedRGBA.GetData(), UncompressedRGBA.Num());
                        Texture->UpdateResource();
                        return Texture;
                    }
                }
            }
        }
        return nullptr;
    }
    
  3. 使用場景: 你可以將此函式用於動態載入和顯示本地圖片作為紋理,例如在使用者介面或遊戲中使用。

確保正確處理圖片格式和檔案路徑,並根據需要調整程式碼以適應不同的影像格式。


程式碼解析

這段示例程式碼的作用是將本地圖片檔案載入並轉換為虛幻引擎中的 UTexture2D 物件。以下是程式碼的逐步解釋:

  1. 載入圖片檔案
    • FFileHelper::LoadFileToArray 用於讀取指定路徑的圖片檔案,並將其資料儲存到 ImageData 陣列中。
  2. 建立圖片包裝器
    • IImageWrapperModule 模組用來處理不同格式的圖片,ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG) 建立一個用於處理 PNG 格式圖片的包裝器。
  3. 設定壓縮資料
    • ImageWrapper->SetCompressed 將圖片資料傳遞給包裝器。
  4. 解壓縮資料
    • ImageWrapper->GetRaw 從包裝器中提取解壓縮的 RGBA 資料。
  5. 建立 UTexture2D 物件
    • UTexture2D::CreateTransient 建立一個臨時的 UTexture2D 物件,大小與圖片相匹配。
    • Texture->PlatformData->Mips[0].BulkData.GetAllocation() 獲取紋理的資料區域,並將解壓縮的圖片資料複製到這個區域。
  6. 更新資源
    • Texture->UpdateResource() 更新紋理資源,使其可用於渲染。
  7. 返回紋理物件
    • 最後返回建立的 UTexture2D 物件。

這樣,你可以動態載入本地圖片,並在虛幻引擎中將其作為紋理使用。

擴充

圖片包裝器Image Wrapper)是一個處理圖片格式的工具,它負責將圖片資料從各種格式(如 PNGJPEG)解碼成原始畫素資料。虛幻引擎中的 IImageWrapper 介面和相關模組(如 IImageWrapperModule)提供了對圖片格式的支援,允許你讀取、解碼和處理不同型別的影像檔案。透過這些包裝器,你可以將圖片檔案轉換為可以在引擎中使用的紋理格式。

相關文章