UE | 读取本地图片

读取本地图片

代码实现

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. 示例代码

    #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)提供了对图片格式的支持,允许你读取、解码和处理不同类型的图像文件。通过这些包装器,你可以将图片文件转换为可以在引擎中使用的纹理格式。

posted @   Dream_moon  阅读(352)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示