ue4 C++ 导入图片

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;

}

时间: 2024-11-05 13:42:11

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

用javascript协助导入图片

用javascript协助导入图片 需求 先说说需求.春节回家见爸妈,老爸迷上了摄影.他把平时的照片都上传到了 成都图片网, 这个成都图片网专门有一个 “快拍成都” 的版块,用于大家将随手拍的生活中的图片分享上去.每天编辑还会选出一张最有特色的图片,刊登到<成都商报>上. 快拍成都版块的网址是:http://photo.chengdu.cn/diary.php,另外,这个成都图片网还带有一个 “ 拍客论坛 “,论坛的网址是:http://photo.chengdu.cn/bbs/. 老爸在兴奋

关于&lt;img&gt;导入图片下面有空白的问题解决方案

上图代码,在网页中导入图片后下面会有一小段空白.在谷歌浏览器调试的时候,会发现外面的包裹层<a>元素的height要比<img>的height多了3个像素(此时已经设置了a{display:block;}).这在网页设计中比较令人头疼,有时候会因为这样一个小空白导致图片无法对齐等等.当然,也有人说 分析原因:知乎上有篇文章讲得很不错.链接:http://www.zhihu.com/question/21558138/answer/18615056 要理解这个问题,首先要弄明白CSS

教你导入图片到几何画板中

用几何画板软件制作课件时,往往需要导入几何画板以外的美丽图片来提高课件的质量.下面介绍几何画板导入图片的方法. 一.粘贴的方法 把所需的图片复制到Windows的剪贴板上,再利用几何画板中"编辑"菜单中的"粘贴图片"命令直接导入一幅图片到课件中:或者右键单击画板中空白处,粘贴图片. 二.直接将图片拖进画板 保存好图片后,用鼠标选中图片,拖动图片到画板中. 三.使用快捷键 复制图片之后,在画板界面中按Ctrl+V. 提示:若要使导入的图片参与动画运动,可以先选中一点,

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

IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片处理类相关的程序时,更是经常用到. 初始化情况下模拟器中的相册中是空的,所以要想选择,我们就得先导入一些图片.通常的做法是将图片直接拖拽到模拟器上,然后模拟器就会用safari打开,这个时候我们再长按图片就会弹出保存到系统相册的菜单了,这样一个完整的图片保存流程就完成了.但是这中方法有一个明显的缺点

教你几何画板如何导入图片

用几何画板软件制作课件时,往往需要导入几何画板以外的美丽图片来提高课件的质量.下面介绍几何画板导入图片的方法. 一.粘贴的方法 把所需的图片复制到Windows的剪贴板上,再利用几何画板中“编辑”菜单中的“粘贴图片”命令直接导入一幅图片到课件中:或者右键单击画板中空白处,粘贴图片. 二.直接将图片拖进画板 保存好图片后,用鼠标选中图片,拖动图片到画板中. 三.使用快捷键 复制图片之后,在画板界面中按Ctrl+V. 提示:若要使导入的图片参与动画运动,可以先选中一点,然后利用上述方法导入图片.这样

怎么在几何画板中导入图片

几何画板是种常见的课件制作软件,但我们在用几何画板制作课件时,常常需要导入一些漂亮的图片来提高我们课件的质量.下面就给大家介绍几何画板导入图片的方法. 一.粘贴的方法 把所需的图片复制到Windows的剪贴板上,再利用几何画板中“编辑”菜单中的“粘贴图片”命令直接导入一幅图片到课件中:或者右键单击画板中空白处,粘贴图片.  在“编辑”菜单下选择“粘贴图片”命令 二.直接将图片拖进画板 保存好图片后,用鼠标选中图片,拖动图片到画板中. 三.使用快捷键 复制图片之后,在画板界面中按Ctrl+V.  

Unity3d 导入图片 自动修改Texture Type为Sprite (2D and UI) 及设置 Packing Tag为文件夹名

Unity3d 的新版 UI 系统在给我们带来很大便利的同时,也添加了一些小麻烦.每次从电脑中导入图片到 Unity3d 中都需要手动设置Texture Type为Sprite (2D and UI) 及设置 Packing Tag.对于需要打包为一个图集的图片,我们一般把它们放到一个文件夹中. 基于以上,我们可以让图片的 Packing Tag 自动设置为 文件夹的名字. 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn Uni

PhotoShop 导入图片序列制作 GIF 动画

从 AE 中导出图片序列 打开 PS,选择 [文件] -> [脚本] -> [将文件载入堆栈-] 导入文件或文件夹,等待图层加载完毕 打开 [窗口] -> [时间轴] 开启时间轴面板,我用的是 CS6,旧版本如果没有 [时间轴] 的话看看是否有 [动画] 点开时间轴面板右上的扩展菜单按钮,选择 [从图层建立帧] 坐下角播放查看,如果是倒序播放的话选择扩展菜单的 [反向帧] 完成后选择 [文件] -> [存储为Web和设备所用格式-],右上角下拉框中选择 GIF 格式,点击 [存储]

Opencv 导入图片 Opengl 显示纹理(含用例代码)

本篇主要是讲使用Opencv导入一副图片,然后讲该副图片当成纹理显示在opengl当中. 首先说如何配置Opencv 我的硬件环境是: Windows10+Visual Studio 2015+opencv3.0 先在此网站下载opencv,下载之后,它是长这样的,点击它,会自动解压缩成名字为"opencv"的文件夹 接下来进行环境配置:从控制面板开始,按着这个路径  Control Panel\System and Security\System 来到高级系统设置(advanced