UE4将读取的PNG图片数据转换为UTexture2D并显示

这篇具有很好参考价值的文章主要介绍了UE4将读取的PNG图片数据转换为UTexture2D并显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路

  1. 从硬盘中读取压缩过的图片文件到二进制数组,获取已压缩的数据;
  2. 将已压缩的数据借助ImageWrapper中的GetRaw函数转换为原始RGB数据;
  3. 填充原始RGB数据到UTexture2D中。

准备

处理图片类型需要使用UE提供的ImageWrapper模块,首先在project.Build.cs中加入ImageWrapper模块。

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "ImageWrapper" });

ImageWrapper是所有图片类型的抽象层,其设计思路如下:

  1. 图片文件数据是经过压缩的数据,称为CompressedData;
  2. 图片文件对应的原始RGBA数据是没有压缩的,且与图片格式无关,称为RawData;
  3. 不同格式的同样图片,其RawData不变,CompressedData随格式而变;
  4. 所有图片格式都可以抽象为一个CompressedData与RawData的组合。

代码 

UFUNCTION(BlueprintCallable, Category = "ImagePlayer")
		static bool LoadImageToTexture2D(const FString& ImagePath, UTexture2D*& InTexture, int32& Width, int32& Height);
bool AImagePlayer::LoadImageToTexture2D(const FString& ImagePath, UTexture2D*& InTexture, int32& Width, int32& Height)
{
    if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath))  //判断是否存在该文件
    {
        return false;
    }

    IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked <IImageWrapperModule>(FName("ImageWrapper"));//启用"ImageWrapper"模型
    TSharedPtr<IImageWrapper> SourceImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);//实例化ImageWrapper类,图片的类型为PNG


    TArray<uint8> SourceImageData;  //存储压缩的二进制图片数据
    if (!FFileHelper::LoadFileToArray(SourceImageData, *ImagePath)) //读取文件资源
    {
        return false;
    }


    if (SourceImageWrapper.IsValid() && SourceImageWrapper->SetCompressed(SourceImageData.GetData(), SourceImageData.GetAllocatedSize()))
    {
        TArray <uint8> UncompressedBGRA;    //存储未压缩的颜色数据,UE4用的颜色格式为BGRA
        if (SourceImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))  //获取未压缩的图片颜色信息,位深度为8
        {
            Height = SourceImageWrapper->GetHeight();	
            Width = SourceImageWrapper->GetWidth();

            InTexture = UTexture2D::CreateTransient(Width, Height, PF_B8G8R8A8);	//临时填充

            if (InTexture)
            {
                void* TextureData = InTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);	//用自带方法"PlatformData"让InTexture和指针TextureData绑定(Lock)并且可读可写,因为下一行的复制函数中的参数要求为void*


                FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());	//复制未压缩的颜色数据

                InTexture->PlatformData->Mips[0].BulkData.Unlock(); //将指针和InTexture解绑(unlock)

                InTexture->UpdateResource();    //刷新
                return true;
            }
        }
    }
    return false;

}

蓝图

创建Widget Blueprint,命名为ImageHUD,添加Image窗口,并勾选Size To Content。

UE4将读取的PNG图片数据转换为UTexture2D并显示,unreal engine 4,c++ UE4将读取的PNG图片数据转换为UTexture2D并显示,unreal engine 4,c++

使用LoadImageToTexture2D函数。

UE4将读取的PNG图片数据转换为UTexture2D并显示,unreal engine 4,c++

关卡蓝图中创建ImageHUD,并添加到视口。

UE4将读取的PNG图片数据转换为UTexture2D并显示,unreal engine 4,c++

 效果

 UE4将读取的PNG图片数据转换为UTexture2D并显示,unreal engine 4,c++

参考 

《大象无形:虚幻引擎程序设计浅析》

B站:UE4 Image处理工具第一讲:从磁盘读取图片数据转成UTexture2D文章来源地址https://www.toymoban.com/news/detail-550117.html

到了这里,关于UE4将读取的PNG图片数据转换为UTexture2D并显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4 常用类型转换

    2024年02月04日
    浏览(39)
  • 使用手机将图片转换成PNG格式怎么做?教你三种转换方法

    怎么使用手机把图片的格式转换成PNG格式呢?现如今的图片格式种类非常之多,有很多种格式的图片我们甚至都打不开它。有时我们需要上传一些照片文件,会有要求照片只能是PNG格式,遇到这种情况我们该怎么使用手机就能够就能将图片格式进行转换呢?其实非常简单,今

    2024年02月15日
    浏览(47)
  • ffmpeg 将视频帧转换成jpg、png等图片

    有时播放实时流的时候有截图的需求,需要将解码出来的图片保存本地或上传服务器,这时就需要将avframe中的数据编码成png、jpg等格式的图片,我们使用ffmpeg的相关编码器就可以实现功能。 首先需要查找图片编码器,比如jpg为AV_CODEC_ID_MJPEG,png为AV_CODEC_ID_PNG 示例代码: 有了

    2024年02月02日
    浏览(40)
  • UE4/5C++多线程插件制作(十九、异步资源读取封装,细节修改)

    目录 MTPResourceLoadManage MTPThreadInterface MTPManage.h MTPManage.cpp RTPAgendy RTPAgendy.h  RTPAgendy.cpp

    2024年02月14日
    浏览(49)
  • UE4-上传图片到服务器

    由于 VaRest 插件无法满足我们上传表单的需求,在这里需要使用其他库方法。 优点: httplib 库是一个以 C++11 特性编写的库,所以编译器也需要能支持 C++11 的。库在使用时只需包含一个头文件即可,非常方便。 缺点: 此库为线程阻塞,使用时还请注意。 由于上传图片需要提

    2024年02月07日
    浏览(45)
  • 如何将labelme生成的json文件转换成png图片(亲测有效)

    单个转换(费时) 1.先进入到你存放json的文件夹的磁盘中,输入d: 2. 激活labelme环境 3. 输入labelme_json_to_dataset并进入到存放json的文件夹 4.完成转换 批量转换(等我更新) 更新来啦!!!(步骤) 1、修改json_to_dataset.py代码 这里它的地址为D:Anaconda3envslabelmeLibsite-packageslabe

    2024年02月13日
    浏览(41)
  • 怎么在电脑上把jpg改成png?批量图片格式转换器分享推荐

    美工在处理图片时,经常使用png格式图片,所以就会有用到格式转换器(https://www.yasuotu.com/geshi),尤其是在需要处理批量图片的时候,今天介绍的这款批量图片格式转换器,可以在线操作,打开浏览器就能完成png格式转换,非常方便,一起来看一下吧。 使用浏览器搜索【压

    2023年04月24日
    浏览(52)
  • 【Python编程】将格式为ppm和pgm的图片批量转换为png或jpg格式的图片

    如果文件夹中有异常图片,则可以使用以下代码从而跳过这些异常图片而不影响转换代码的运行。例如本人在解压时中断而导致的图片异常问题,图片示例如下:

    2024年02月11日
    浏览(57)
  • Cesium for UE4中的坐标系及其转换(再续)

    A lightweight structure to encapsulate coordinate transforms. 轻量级的坐标转换类,可以在ECEF、经纬度和UE4坐标之间进行转换。 Earth-Centered, Earth-Fixed (ECEF) coordinates Georeferenced coordinates (Latitude/Longitude/Height) Unreal coordinates (relative to the unreal world origin) 地心坐标系 Cesium for UE4 wiki

    2024年02月11日
    浏览(48)
  • UE4/5如何将蓝图工程转换为UEc++工程(新手向)

    ue4和ue5如果一开始选择了蓝图工程,在后期如何转换为c++工程 首先我们来看一下,ue4和ue5创建工程的地方,选择的是蓝图:   然后,我们要如何将蓝图工程,转换为c++工程  现在我们的蓝图工程里面,只有内容,而没有c++项目,如果是ue4,则在这里添加: 如果是ue5,则是在

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包