当前位置: 首页 > news >正文

ue4加载本地图片_ue4 C++ 导入图片

导入本地图片

void SDrawHouseTypeTools::OnButtonClickLoadImage()

{

//打开文件夹

TArray OpenFilenames;

TSharedPtr ParentWindow = FSlateApplication::Get().GetActiveTopLevelWindow();

void* ParentWindowHandle = (ParentWindow.IsValid() && ParentWindow->GetNativeWindow().IsValid()) ? ParentWindow->GetNativeWindow()->GetOSWindowHandle() : nullptr;

if (ExtendFunc::OpenFileDialog(

ParentWindowHandle,

NSLOCTEXT("UIHome", "OpenReferencePictureTitle", "打开户型图片文件...").ToString(),

FPaths::GameDir(),

TEXT(""),

NSLOCTEXT("UIHome", "OpenReferencePictureFilter", "All Files (*.*)|*.*|户型图片文件 (*.png)|*.png|户型图片文件 (*.jpg)|*.jpg").ToString(),

ExtendFunc::EFileDialogFlags::None,

OpenFilenames))

{

if (OpenFilenames.Num() > 0)

{

FString OpenFilename = OpenFilenames[0];

FName BrushName(*OpenFilename);

//传了图片路径,返回可以用来显示在runtime中的图片纹理

if (SpriteTexture.IsValid() && SpriteTexture->IsRooted())

{

SpriteTexture->RemoveFromRoot();

}

// 判断图片得格式是否正确

SpriteTexture = TWeakObjectPtr(GetTexture2DFromDiskFile(OpenFilename));

if (SpriteTexture.IsValid())

{

SpriteTexture->AddToRoot();

//将数据存储并导入到画图方法中

FIntPoint ImageSize = FIntPoint(SpriteTexture->GetSizeX(), SpriteTexture->GetSizeY());

IHardModeModule::Get().GetImageSize() = ImageSize;

TextureAlpha = 0.5;

HardEdMode->OnHouseImgAlphaChanged(TextureAlpha);

HardEdMode->SetHouseImg(SpriteTexture.Get(), ImageSize);

}

else

{

FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT("请导入正确格式的图片!")));

OnButtonClickLoadImage();

}

}

}

}

//获取图片纹理

UTexture2D* SDrawHouseTypeTools::GetTexture2DFromDiskFile(const FString& FilePath)

{

// 如果找到该文件,则返回true,否则为false

if (!FPaths::FileExists(FilePath))

{

UE_LOG(LogTemp, Error, TEXT("File not found: %s"), *FilePath);

return nullptr;

}

// 从文件中加载压缩的字节数据

TArray FileData;

if (!FFileHelper::LoadFileToArray(FileData, *FilePath))

{

UE_LOG(LogTemp, Error, TEXT("Failed to load file: %s"), *FilePath);

return nullptr;

}

// 使用ImageWrapper模块检测图像类型

IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(TEXT("ImageWrapper"));

EImageFormat::Type ImageFormat = ImageWrapperModule.DetectImageFormat(FileData.GetData(), FileData.Num());

if (ImageFormat == EImageFormat::Invalid)

{

UE_LOG(LogTemp, Error, TEXT("Unrecognized image file format: %s"), *FilePath);

return nullptr;

}

// 为检测到的图像格式创建一个图像包装

IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(ImageFormat);

if (!ImageWrapper.IsValid())

{

UE_LOG(LogTemp, Error, TEXT("Failed to create image wrapper for file: %s"), *FilePath);

return nullptr;

}

// 解压图像数据

const TArray* RawData = nullptr;

ImageWrapper->SetCompressed(FileData.GetData(), FileData.Num());

ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, RawData);

if (RawData == nullptr)

{

UE_LOG(LogTemp, Error, TEXT("Failed to decompress image file: %s"), *FilePath);

return nullptr;

}

// 创建纹理并上传未压缩的图像数据

FString TextureBaseName = TEXT("Texture_") + FPaths::GetBaseFilename(FilePath);

// UObject* Outer = nullptr;

UTexture2D* mytexture = MyCreateTexture(*RawData, ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), EPixelFormat::PF_B8G8R8A8, FName(*TextureBaseName));

return mytexture;

}

UTexture2D* SDrawHouseTypeTools::MyCreateTexture(const TArray& PixelData, int32 InSizeX, int32 InSizeY, EPixelFormat InFormat, FName BaseName)

{

// 无耻地抄袭UTexture2D:CreateTransient一些修改

if (InSizeX <= 0 || InSizeY <= 0 || (InSizeX % GPixelFormats[InFormat].BlockSizeX) != 0 || (InSizeY % GPixelFormats[InFormat].BlockSizeY) != 0)

{

return nullptr;

}

// 最重要的不同之处在于UTexture2D::CreateTransient:我们为新结构提供一个名称和一个所有者

UTexture2D* NewTexture = NewObject(GetTransientPackage(), NAME_None, RF_Transient);

NewTexture->PlatformData = new FTexturePlatformData();

NewTexture->PlatformData->SizeX = InSizeX;

NewTexture->PlatformData->SizeY = InSizeY;

NewTexture->PlatformData->PixelFormat = InFormat;

// 分配第一个纹理映射并上传像素数据

int32 NumBlocksX = InSizeX / GPixelFormats[InFormat].BlockSizeX;

int32 NumBlocksY = InSizeY / GPixelFormats[InFormat].BlockSizeY;

FTexture2DMipMap* Mip = new(NewTexture->PlatformData->Mips) FTexture2DMipMap();

Mip->SizeX = InSizeX;

Mip->SizeY = InSizeY;

Mip->BulkData.Lock(LOCK_READ_WRITE);

void* TextureData = Mip->BulkData.Realloc(NumBlocksX * NumBlocksY * GPixelFormats[InFormat].BlockBytes);

FMemory::Memcpy(TextureData, PixelData.GetData(), PixelData.Num());

Mip->BulkData.Unlock();

NewTexture->UpdateResource();

return NewTexture;

}

相关文章:

  • python爬虫类型_python爬虫主流存储类型实战
  • 煤炭及煤化工加工会产生什么危废_煤化工危废处置难在哪
  • python如何打印表_Python中的打印表
  • python 傅里叶滤波_Python_opencv_傅里叶变换
  • hbuilderx如何导入样式_HBuilderX使用Vant组件库
  • 为什么nodejs是单进程的_Nodejs探秘:深入理解单线程实现高并发原理
  • python实现相空间重构_用非平衡零差法实现wigner函数的简单测量
  • list stream 最大和最小值_Java 8 Stream 求集合元素每个属性的最大值
  • sap增加事务代码权限_sap 事务代码跳过权限检查
  • r语言remarkdown展示图_Rmarkdown用法与R语言动态报告
  • jsonpath 判断是否包含_JsonNode findPath方法详解 JsonNode判断是否为空详解
  • php 实现mqtt 订阅监听功能出错_Redis发布订阅原理以及java实现
  • 前端工程师需要学习ps 吗_前端人员一定要掌握的PS技巧
  • 节能证书在哪里查询_证书查询
  • python 检查域名是否可以访问_python检查URL是否能正常访问
  • hexo+github搭建个人博客
  • 分享一款快速APP功能测试工具
  • __proto__ 和 prototype的关系
  • AngularJS指令开发(1)——参数详解
  • angular学习第一篇-----环境搭建
  • gf框架之分页模块(五) - 自定义分页
  • js操作时间(持续更新)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • ng6--错误信息小结(持续更新)
  • nodejs实现webservice问题总结
  • Protobuf3语言指南
  • Service Worker
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 全栈开发——Linux
  • 时间复杂度与空间复杂度分析
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 译有关态射的一切
  • hi-nginx-1.3.4编译安装
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • $GOPATH/go.mod exists but should not goland
  • (LeetCode) T14. Longest Common Prefix
  • (二)丶RabbitMQ的六大核心
  • (四)Controller接口控制器详解(三)
  • (转)Scala的“=”符号简介
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .Net 8.0 新的变化
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET值类型变量“活”在哪?
  • @Autowired和@Resource的区别
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Mapper作用
  • @RequestBody与@ModelAttribute
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C#]winform部署yolov9的onnx模型