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;
}

ue4 C++ 导入图片的更多相关文章

  1. 用javascript协助导入图片

    用javascript协助导入图片 需求 先说说需求.春节回家见爸妈,老爸迷上了摄影.他把平时的照片都上传到了 成都图片网, 这个成都图片网专门有一个 "快拍成都" 的版块,用于大 ...

  2. (转载)SQL中导入图片

    SQL中导入图片 分类: 论坛精贴 2006-05-10 12:07 398人阅读 评论(0) 收藏 举报 sqlimage服务器insertlogingo 1.建立过程CREATE PROCEDUR ...

  3. 有关ios中images.xcassets的导入图片等命名问题

    最近遇到一个问题,就是在设置启动图片的时候,把启动图片命名设置为了xxx@2x.png, 然后应用死活没有显示启动图片,调试了很久,才发现是因为文件命名的原因. 1. 如果在图片的下方有2x或3x的标 ...

  4. [转]iOS:批量导入图片和视频到模拟器的相册

    IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片 ...

  5. AutoCAD中导入图片

    导入图片涉及到两个关键的问题:如何将图片放置到指定的位置或范围内:如何修改图片的路径类型,如相对路径.绝对路径. 本文以AutoCAD 2018位演示截图来源. 1 将图片放置到指定的位置或范围内 ( ...

  6. FastStone+ImageReady+Kutools plus导入图片到Excel单元格

    先前打算自己做一个也附带训练下,发现有下面方法也好. 1)做帮助文档时需要一种格式(需要将图片导入到Excel中时,假如是按此法归类汇总) 2)FastStone滚动截图       粘贴到Photo ...

  7. [GE]导入图片至Word,然后按规则命名(2/2)

    #将所有docx文件改成可读 Set-ItemProperty -Path "e:\screenshot\*.docx" -Name IsReadOnly -Value $fals ...

  8. flash导入图片缩放后出现毛边、失真、锯齿、文字模糊不清晰的情况

    原因: 1.flash的性能非常差,这就不得不让它做大量的优化. 2.图片缩放,目前业界有多种算法,画质越好的算法,计算量越大. 3.flash优化了图片缩放,使用了质量非常低的缩放算法.这个做法,保 ...

  9. UGUI之导入图片之前自动设置图片打包的 tag

    之前一直在用的是NGUI,最近不知怎么突然兴趣来潮,想学习一下UGUI,毕竟,现在纵观Unity的市场,完全是UGUI的天下,NGUI已经渐渐退隐江湖,哈哈哈... 先来记录下,在图片资源导入到Uni ...

随机推荐

  1. 有关ArrayList常用方法的源码解析

    我相信几乎所有的同学在大大小小的笔试.面试过程中都会被问及ArrayList与LinkedList之间的异同点.稍有准备的人这些问题早已烂熟于心,前者基于数组实现,后者基于链表实现:前者随机方法速度快 ...

  2. CentOS下安装php的mbstring扩展

    php的mbstring扩展如果没有安装会导致一些问题: 例1:登陆phpMyAdmin的时候会提示没字符串编码和字符串处理库 php_mbstring,有些程序中会用到mb_substr函数没有ph ...

  3. php检测当前浏览器是否为微信浏览器

    <?php /** php检测当前浏览器是否为微信浏览器 */ function is_weixin_browser(){ if(strpos($_SERVER['HTTP_USER_AGENT ...

  4. 利用CSS3新特性实现完全兼容的自定义滚动条。

    背景:最近项目里面因为统一页面风格,用到了自定义滚动条,在完成之前的那个滚动条的时候,与网上各个滚动条插件实现的方法类似,相当于造了轮子,通过css3的 网上看到的滚动条插件多数是通过监听内容的滚动事 ...

  5. 最全的CSS浏览器兼容问题(转至http://68design.net/Web-Guide/HTMLCSS/37154-1.html)

    最全的CSS浏览器兼容问题   CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2 ...

  6. 进击的AssetBundles和它的工具们

    0x00 前言 周末的时候在家看了下去年的Unite16 LA的视频.其中一个session很有趣,是AssetBundles开发团队Reichert的一个"总结过往,畅想未来"的 ...

  7. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  8. mysql主从数据库设置备忘

    [mysqld] binlog-do-db = databasename1 binlog-do-db = databasename2 binlog-do-db = databasename3 -- 且 ...

  9. Vue2.0 生产环境部署

    简要:继上次搭建vue环境后,开始着手vue的学习;为此向大家分享从开发环境部署到生产环境(线上)中遇到的问题和解决办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一. ...

  10. language-detection 语言检测工具 java版的应用demo

    本文基本借鉴大佬文章:http://www.cnblogs.com/makemelaugh/archive/2012/09/26/2704802.html 在此基础上添加一些自己的补充,方便查阅. 提 ...