ue4 C++ 導入圖片


導入本地圖片
void SDrawHouseTypeTools::OnButtonClickLoadImage()
{
 //打開文件夾
 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();
  }
}
 }
}
//獲取圖片紋理
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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM