文章目录

  • 版本
  • 一、UE4处理图片方式
  • 二、具体步骤
    • 创建C++类的函数库
      • (1).h文件
      • (2).cpp方法实现
      • (3)完整方法代码
  • 参考文献

版本

UE4.26


一、UE4处理图片方式

在UE4中,引擎本身提供了ImagerWrapper 作为所有图片类型的抽象层来处理图片。
导入图片具体步骤为:

  1. 读取文件压缩后的数据CompressedData.方法为FFileHelper::LoadFileToArray(TArray<uint8> &result, const char* filename)

  2. 将压缩数据填充进ImageWrapper的类中.方法为SetCompressed(const void *InCompressedData, int64 InCompressedSize)

  3. 获取未压缩的图片数据RawData.方法为GetRaw(ERGBFormat InFormat, int32 InBitDepth, TArray<uint8> &OutRawData)

  4. 用未压缩的数据复制进输出变量。方法为Fmemory::Memcpy(void *Dest, const void *Src, SIZE_T Count)

二、具体步骤

创建C++类的函数库

(1).h文件

代码如下:

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PictureToolsLibaray.generated.h"/*** */
UCLASS()
class PICTURETR_API UPictureToolsLibaray : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public:UFUNCTION(BlueprintCallable, Category = "PictureTool")static bool LoadImageToTexture2D(const FString& ImagePath, UTexture2D*& InTexture, int32& Width, int32& Height);};

这里重点就是public里面的方法

static bool LoadImageToTexture2D(const FString& ImagePath, UTexture2D*& InTexture, int32& Width, int32& Height);

参数依次为: 图片路径+文件名处理后图片输出为纹理图片宽度图片高度

(2).cpp方法实现

  1. 启用引擎自带图片处理模型ImageWrapperModule.
IImageWrapperModule&ImageWrapperModule = FModuleManager::LoadModuleChecked <IImageWrapperModule>(FName("ImageWrapper"));//启用"ImageWrapper"模型
  1. 创建ImageWrapper类,存储图片数据.参数为传入图片类型,这里为PNG
TSharedPtr<IImageWrapper> SourceImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);//实例化ImageWrapper类,构造参数为输入图片的类型

:这里的类型在4.16之前为IImageWrapperPtr,在4.16之后改为TSharedPtr<IImageWrapper>,虽然目前仍能使用IImageWrapperPtr但是官方建议使用TSharedPtr<IImageWrapper>

  1. 载入压缩后的图片数据.
TArray<uint8> SourceImageData; //存储原始图片的颜色信息
FFileHelper::LoadFileToArray(SourceImageData, *ImagePath)
  1. 填充压缩数据进之前的ImageWrapper
SourceImageWrapper->SetCompressed(SourceImageData.GetData(), SourceImageData.GetAllocatedSize())
  1. 获取未压缩颜色数据,UE4所用图片颜色为BGRA 格式,所以这边的ERGBFormatBGRA
Array <uint8> UncompressedBGRA;                    //存储未压缩的颜色数据,UE4用的颜色格式为BGRA
SourceImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA)
  1. 复制未压缩数据
   Height = SourceImageWrapper->GetHeight(); //获取高度和宽度Width = SourceImageWrapper->GetWidth();/*临时填充——应该是先确定图片长宽->再填充颜色数据*/InTexture = UTexture2D::CreateTransient(Width, Height, PF_B8G8R8A8);   /*用自带方法"PlatformData"让 InTexture和指针TextureData绑定(Lock)并且可读可写,因为下一行的复制函数中的参数要求为void**/void* TextureData = InTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);  /*复制,将未压缩的颜色数据和数据大小复制*/FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num()); InTexture->PlatformData->Mips[0].BulkData.Unlock();//将指针和InTexture解绑(unlock)InTexture->UpdateResource();//刷新

(3)完整方法代码

// Fill out your copyright notice in the Description page of Project Settings.#include "PictureToolsLibaray.h"
bool UPictureToolsLibaray::LoadImageToTexture2D(const FString& ImagePath, UTexture2D*& InTexture, int32& Width, int32& Height)
{TArray<uint8> SourceImageData;   //存储原始图片的颜色信息IImageWrapperModule&ImageWrapperModule = FModuleManager::LoadModuleChecked <IImageWrapperModule>(FName("ImageWrapper"));//启用"ImageWrapper"模型TSharedPtr<IImageWrapper> SourceImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);//实例化ImageWrapper类,构造参数为输入图片的类型if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath))//是否存在该文件{return false;}if (!FFileHelper::LoadFileToArray(SourceImageData, *ImagePath))//将文件有压缩的文件信息传入SourceImageData{return false;}if (SourceImageWrapper.IsValid() && SourceImageWrapper->SetCompressed(SourceImageData.GetData(), SourceImageData.GetAllocatedSize()))//填充数据进创建的"ImageWrapper"{TArray <uint8> UncompressedBGRA;                    //存储未压缩的颜色数据,UE4用的颜色格式为BGRAif (SourceImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))//获取未压缩的图片颜色信息{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;}

参考文献

《大象无形》

B站视频吉叶子

UE4初探——从外部导入图片相关推荐

  1. Android --- 夜神模拟器中没有图片怎么办?夜神模拟器中怎么导入图片?

    问题: 夜神模拟器中没有图片怎么办?夜神模拟器中怎么导入图片? 解决: 1.点击右侧文件助手 2.点击"打开电脑文件夹" 3.弹出如下文件夹 4.点击imageShare 5.点击 ...

  2. 在myeclipse中导入图片

    1.在myeclipse中导入图片,选中项目目录建立一个文件夹,名字任意一般是images 2.要说明一点,以后要建立的文件比较多,在引用图片的时候为了方便,一般添加到引用图片的同一级目录下,已用格式 ...

  3. IOS:批量导入图片和视频到模拟器的相册

    批量导入图片和视频到模拟器的相册 IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系 ...

  4. java怎么导入图片_iPad Pro插U盘不能导入图片?技术宅教你怎么做

    iPad Pro面世有一段时间了,配备Type-C接口让一群技术宅兴奋的搓搓手. Type-C又能输出音频又能输出视频,还能转很多东西,想干啥都行了啊. 市面上很多Type-C扩展坞,那就可以扩展很多 ...

  5. pyqt label上的图片旋转_python中tkinter入门之config、Scale、Canvas和导入图片

    先导入tkinter from tkinter import * import tkinter.font as font root = Tk() config config可以改变控件的属性. l = ...

  6. Python批量导入图片生成能治疗颈椎病的HTML5版课件

    本文要点:Python文件操作,HTML5的figure元素和CSS3属性的用法. 说明:1):本文图片来自于相关阅读中Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片或Pyt ...

  7. python qt listview如何显示图片_python如何导入图片

    python如何导入图片? 一.导入图片资源 方法1:直接从源图片中导(图片位于images文件夹内) 1 2 3 4 self.label1=QLabel(self)self.label1.setP ...

  8. python如何加载图片_python如何导入图片

    python如何导入图片? 一.导入图片资源 方法1:直接从源图片中导(图片位于images文件夹内) 1 2 3 4 self.label1=QLabel(self) self.label1.set ...

  9. Excel中 使用链接 批量导入图片

    ■前言 我之前看到很多使用VBA方式导入图片的. 今天发现,使用复制链接这种方式,也可以导入图片. ■导入方法 <table><img src="C:\MyPicture\ ...

最新文章

  1. 绩效C,看不到希望...
  2. 关于Verilog 中的for语句的探讨
  3. iOS Sprite Kit教程之使用帮助文档以及调试程序
  4. JAVA——实现七牛云对象存储Region对象采用配置方式生成解决方案
  5. Message 消息提示
  6. S2SH CRUD 整合
  7. [css] 用CSS实现tab切换
  8. 用java打出矩形阵型的数字_java输出数字发散矩形
  9. 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
  10. matlab fir overflow,实战fir脚本打ipa包
  11. 高通运行linux,Linux实现对高通多核支持
  12. 固定二进制位的整型变量
  13. wordpress获取home_wordpress各种获取路径和URl地址的函数总结
  14. android 编译api,Android逆向利器,直接将apk转换为可二次开发Android工程,提供So hook Api,......
  15. java 判断浏览器_Java怎么判断访问者使用的是360浏览器
  16. ae输出quicktime设置_AE设置渲染输出视频及视频格式技巧教程
  17. 免费可商用图片素材网站,建议收藏
  18. 90后程序员的头发危机
  19. 计算机中解决不匹配,电脑显示屏显示不匹配.怎么办
  20. 风景日历java制作_风景日历制作系统

热门文章

  1. SSM框架下实现form表单提交的方式
  2. 5g云服务器性能,5G云手机是噱头吗?多多云手机功能性能媲美真机
  3. 怎么使用3DMax制作三维地形
  4. 双12无线蓝牙耳机怎么选?商城热销十大高人气蓝牙耳机排名
  5. 不同色系的窗帘带来的含义也不一样 | 好佳居窗帘十大品牌
  6. Arcgis pro——获取经纬度坐标
  7. Android 获取电池电压和电池电压高提示
  8. word2vec需要去标点吗_word2vec学习笔记(应用篇)(金庸武侠)
  9. 打造抖音热门视频的3大技巧,你还在犹豫什么?丨国仁网络资讯
  10. c语言:字符串和内存函数介绍