目录
结果图
节点样式
主要代码
(注释纯属个人理解,可能存在错误)
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
#include "GameFramework/Actor.h"
#include "SDProject01/Lib/Lib.h"
#include "LoadLocalPic.generated.h"
UCLASS()
class SDPROJECT01_API ALoadLocalPic : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ALoadLocalPic();
UFUNCTION(BlueprintCallable,Category="MyFunction2Load",meta=(Keywords="Load Image"))
int testFunc(int a, int b);
UFUNCTION(BlueprintCallable, Category = "MyFunction2Load", meta = (Keywords = "Load Image"))
UTexture2D* LoadImageFromFile(const FString& ImagePath);
};
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "LoadLocalPic.h"
// Sets default values
ALoadLocalPic::ALoadLocalPic()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
int ALoadLocalPic::testFunc(int a, int b)
{
return a + b;
}
UTexture2D* ALoadLocalPic::LoadImageFromFile(const FString& ImagePath)
{
//判断地址为空
if (ImagePath.IsEmpty()) {
Lib::echo("Path is empty", 3);
return nullptr;
}
//判断是否存在文件,文件是否能转为数组
TArray<uint8> CompressedData;
if (!FFileHelper::LoadFileToArray(CompressedData, *ImagePath)) {
Lib::echo("file not find",3);
return nullptr;
}
//判断文件格式
EImageFormat imageformat = EImageFormat::Invalid;
if (ImagePath.EndsWith(".png"))
imageformat = EImageFormat::PNG;
else if (ImagePath.EndsWith(".jpg") || ImagePath.EndsWith(".jpeg"))
imageformat = EImageFormat::JPEG;
else
{
Lib::echo("fileformat false", 3);
return nullptr;
}
//创建图片封装器
IImageWrapperModule& imageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("IMageWrapper"));
TSharedPtr<IImageWrapper> imageWrapper = imageWrapperModule.CreateImageWrapper(imageformat);
//解码图片
//获取图片信息
if (!imageWrapper->SetCompressed(CompressedData.GetData(), CompressedData.Num())) {
Lib::echo("Compressed file failed", 3);
return nullptr;
}
//创建纹理
TArray<uint8> UncompressedRGBA;
if (!imageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))
return nullptr;
UTexture2D* texture2d= UTexture2D::CreateTransient(imageWrapper->GetWidth(), imageWrapper->GetHeight(), PF_R8G8B8A8);
if (!texture2d)
return nullptr;
//赋值纹理
void* texturedata = texture2d->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(texturedata, UncompressedRGBA.GetData(), UncompressedRGBA.Num());
texture2d->PlatformData->Mips[0].BulkData.Unlock();
texture2d->UpdateResource();
return texture2d;
}
调试代码
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
/**
*
*/
class SDPROJECT01_API Lib
{
public:
Lib();
~Lib();
static void echo(FString value, float duration);
static void echo(float value, float duration);
};
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "SDProject01/Lib/Lib.h"
Lib::Lib()
{
}
Lib::~Lib()
{
}
void Lib::echo(FString value, float duration)
{
GEngine->AddOnScreenDebugMessage(-1, duration, FColor::Blue, value);
}
void Lib::echo(float value, float duration)
{
const FString temp = FString::Printf(TEXT("%f"), value);
GEngine->AddOnScreenDebugMessage(-1,duration,FColor::Blue,temp);
}