UE4初探——从外部导入图片
文章目录
- 版本
- 一、UE4处理图片方式
- 二、具体步骤
- 创建C++类的函数库
- (1).h文件
- (2).cpp方法实现
- (3)完整方法代码
- 参考文献
版本
UE4.26
一、UE4处理图片方式
在UE4中,引擎本身提供了ImagerWrapper 作为所有图片类型的抽象层来处理图片。
导入图片具体步骤为:
读取文件压缩后的数据CompressedData.方法为
FFileHelper::LoadFileToArray(TArray<uint8> &result, const char* filename)
将压缩数据填充进ImageWrapper的类中.方法为
SetCompressed(const void *InCompressedData, int64 InCompressedSize)
获取未压缩的图片数据RawData.方法为
GetRaw(ERGBFormat InFormat, int32 InBitDepth, TArray<uint8> &OutRawData)
用未压缩的数据复制进输出变量。方法为
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方法实现
- 启用引擎自带图片处理模型ImageWrapperModule.
IImageWrapperModule&ImageWrapperModule = FModuleManager::LoadModuleChecked <IImageWrapperModule>(FName("ImageWrapper"));//启用"ImageWrapper"模型
- 创建ImageWrapper类,存储图片数据.参数为传入图片类型,这里为PNG
TSharedPtr<IImageWrapper> SourceImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);//实例化ImageWrapper类,构造参数为输入图片的类型
注:这里的类型在4.16之前为IImageWrapperPtr
,在4.16之后改为TSharedPtr<IImageWrapper>
,虽然目前仍能使用IImageWrapperPtr
但是官方建议使用TSharedPtr<IImageWrapper>
- 载入压缩后的图片数据.
TArray<uint8> SourceImageData; //存储原始图片的颜色信息
FFileHelper::LoadFileToArray(SourceImageData, *ImagePath)
- 填充压缩数据进之前的ImageWrapper类
SourceImageWrapper->SetCompressed(SourceImageData.GetData(), SourceImageData.GetAllocatedSize())
- 获取未压缩颜色数据,UE4所用图片颜色为BGRA 格式,所以这边的ERGBFormat为 BGRA
Array <uint8> UncompressedBGRA; //存储未压缩的颜色数据,UE4用的颜色格式为BGRA
SourceImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA)
- 复制未压缩数据
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初探——从外部导入图片相关推荐
- Android --- 夜神模拟器中没有图片怎么办?夜神模拟器中怎么导入图片?
问题: 夜神模拟器中没有图片怎么办?夜神模拟器中怎么导入图片? 解决: 1.点击右侧文件助手 2.点击"打开电脑文件夹" 3.弹出如下文件夹 4.点击imageShare 5.点击 ...
- 在myeclipse中导入图片
1.在myeclipse中导入图片,选中项目目录建立一个文件夹,名字任意一般是images 2.要说明一点,以后要建立的文件比较多,在引用图片的时候为了方便,一般添加到引用图片的同一级目录下,已用格式 ...
- IOS:批量导入图片和视频到模拟器的相册
批量导入图片和视频到模拟器的相册 IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系 ...
- java怎么导入图片_iPad Pro插U盘不能导入图片?技术宅教你怎么做
iPad Pro面世有一段时间了,配备Type-C接口让一群技术宅兴奋的搓搓手. Type-C又能输出音频又能输出视频,还能转很多东西,想干啥都行了啊. 市面上很多Type-C扩展坞,那就可以扩展很多 ...
- pyqt label上的图片旋转_python中tkinter入门之config、Scale、Canvas和导入图片
先导入tkinter from tkinter import * import tkinter.font as font root = Tk() config config可以改变控件的属性. l = ...
- Python批量导入图片生成能治疗颈椎病的HTML5版课件
本文要点:Python文件操作,HTML5的figure元素和CSS3属性的用法. 说明:1):本文图片来自于相关阅读中Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片或Pyt ...
- python qt listview如何显示图片_python如何导入图片
python如何导入图片? 一.导入图片资源 方法1:直接从源图片中导(图片位于images文件夹内) 1 2 3 4 self.label1=QLabel(self)self.label1.setP ...
- python如何加载图片_python如何导入图片
python如何导入图片? 一.导入图片资源 方法1:直接从源图片中导(图片位于images文件夹内) 1 2 3 4 self.label1=QLabel(self) self.label1.set ...
- Excel中 使用链接 批量导入图片
■前言 我之前看到很多使用VBA方式导入图片的. 今天发现,使用复制链接这种方式,也可以导入图片. ■导入方法 <table><img src="C:\MyPicture\ ...
最新文章
- 绩效C,看不到希望...
- 关于Verilog 中的for语句的探讨
- iOS Sprite Kit教程之使用帮助文档以及调试程序
- JAVA——实现七牛云对象存储Region对象采用配置方式生成解决方案
- Message 消息提示
- S2SH CRUD 整合
- [css] 用CSS实现tab切换
- 用java打出矩形阵型的数字_java输出数字发散矩形
- 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
- matlab fir overflow,实战fir脚本打ipa包
- 高通运行linux,Linux实现对高通多核支持
- 固定二进制位的整型变量
- wordpress获取home_wordpress各种获取路径和URl地址的函数总结
- android 编译api,Android逆向利器,直接将apk转换为可二次开发Android工程,提供So hook Api,......
- java 判断浏览器_Java怎么判断访问者使用的是360浏览器
- ae输出quicktime设置_AE设置渲染输出视频及视频格式技巧教程
- 免费可商用图片素材网站,建议收藏
- 90后程序员的头发危机
- 计算机中解决不匹配,电脑显示屏显示不匹配.怎么办
- 风景日历java制作_风景日历制作系统