void SDrawHouseTypeTools::OnButtonClickLoadImage()
{
// 当前如果是在硬装模块,则可进行导入户型操作
FHardEdMode* HardEdMode = (FHardEdMode*)GLevelEditorModeTools().GetActiveMode(FBuiltinEditorModes::EM_HardEdModeId);
if (HardEdMode)
{
//打开文件夹
TArray<FString> OpenFilenames;
TSharedPtr<SWindow> 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<UTexture2D>(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();
}
}
}
}
else
{
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT(" ")));
}
}
//获取图片纹理
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<uint8> FileData;
if (!FFileHelper::LoadFileToArray(FileData, *FilePath))
{
UE_LOG(LogTemp, Error, TEXT("Failed to load file: %s"), *FilePath);
return nullptr;
}
// 使用ImageWrapper模块检测图像类型
IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(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<uint8>* 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<uint8>& 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<UTexture2D>(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;
}
- 用javascript协助导入图片
用javascript协助导入图片 需求 先说说需求.春节回家见爸妈,老爸迷上了摄影.他把平时的照片都上传到了 成都图片网, 这个成都图片网专门有一个 "快拍成都" 的版块,用于大 ...
- (转载)SQL中导入图片
SQL中导入图片 分类: 论坛精贴 2006-05-10 12:07 398人阅读 评论(0) 收藏 举报 sqlimage服务器insertlogingo 1.建立过程CREATE PROCEDUR ...
- 有关ios中images.xcassets的导入图片等命名问题
最近遇到一个问题,就是在设置启动图片的时候,把启动图片命名设置为了xxx@2x.png, 然后应用死活没有显示启动图片,调试了很久,才发现是因为文件命名的原因. 1. 如果在图片的下方有2x或3x的标 ...
- [转]iOS:批量导入图片和视频到模拟器的相册
IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片 ...
- AutoCAD中导入图片
导入图片涉及到两个关键的问题:如何将图片放置到指定的位置或范围内:如何修改图片的路径类型,如相对路径.绝对路径. 本文以AutoCAD 2018位演示截图来源. 1 将图片放置到指定的位置或范围内 ( ...
- FastStone+ImageReady+Kutools plus导入图片到Excel单元格
先前打算自己做一个也附带训练下,发现有下面方法也好. 1)做帮助文档时需要一种格式(需要将图片导入到Excel中时,假如是按此法归类汇总) 2)FastStone滚动截图 粘贴到Photo ...
- [GE]导入图片至Word,然后按规则命名(2/2)
#将所有docx文件改成可读 Set-ItemProperty -Path "e:\screenshot\*.docx" -Name IsReadOnly -Value $fals ...
- flash导入图片缩放后出现毛边、失真、锯齿、文字模糊不清晰的情况
原因: 1.flash的性能非常差,这就不得不让它做大量的优化. 2.图片缩放,目前业界有多种算法,画质越好的算法,计算量越大. 3.flash优化了图片缩放,使用了质量非常低的缩放算法.这个做法,保 ...
- UGUI之导入图片之前自动设置图片打包的 tag
之前一直在用的是NGUI,最近不知怎么突然兴趣来潮,想学习一下UGUI,毕竟,现在纵观Unity的市场,完全是UGUI的天下,NGUI已经渐渐退隐江湖,哈哈哈... 先来记录下,在图片资源导入到Uni ...
随机推荐
- Spingmvc项目注册登录图片验证码(比较灵活的验证码)
最近项目中注册模块要加一个图片验证码功能. 写下来记录下. 1:首先用什么实现,我用的servlet. 后台java代码:RandomValidateCode 类 ,这个类是生成随即验证码和干扰线,可 ...
- war包中少了class文件
用eclipse的maven工具打包(执行mvn clean install 和 mvn package)后,再启动wildfly, war包应该会自动复制到wildfly的deployment ...
- 如何在前端模版引擎开发中避免使用eval函数
前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用.于是根据自己对模版引擎的理解,定义自己的模版格式,然后,根据自己定义的格式,编写处理函数,将模版标签中的字符串,解析成可执行的字 ...
- org.apache.commons.lang3 的随机数生成
apache org.apache.commons.lang3 的随机数生成工具,方便使用. String a12 = RandomStringUtils.random(4, "012345 ...
- JAVA基础——异常详解
JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...
- String,StringBuffer与StringBuilder
1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...
- Linux之定时任务补充
定时任务两实例 例1: 每分钟打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中. [root@chengliang log]# mkdir -p /server/log/ ...
- ionic ios项目真机运行-不用开发者账号
ionic ios项目真机运行-不用开发者账号 1. 添加ios平台 ionic platform add ios 2.使用XCODE打开项目 3.使用APPID登录XCODE 打开XCODE账号登录 ...
- 分享一款简单好用的HTML拼接工具
今天分享一款很好用的字符串拼接工具,在前端开发中,经常需要我们去手动拼接HTML代码,如果你经常这么做,那么肯定会因为单双引号的问题弄得焦头烂额.有了这个拼接工具,妈妈再也不用担心我拼不好html代码 ...
- Python使用QRCode生成二维码
PIL和QRCode下载地址: http://www.pythonware.com/products/pil/ https://pypi.python.org/pypi/qrcode/5.1 #你可能 ...