0


UE5 C++ 读取本地图片并赋值到UI上

结果图


节点样式

主要代码

(注释纯属个人理解,可能存在错误)

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

调试代码

// 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);
};
// 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);
}
标签: ue5

本文转载自: https://blog.csdn.net/weixin_56537692/article/details/135943173
版权归原作者 我的巨剑能轻松搅动潮汐 所有, 如有侵权,请联系我们删除。

“UE5 C++ 读取本地图片并赋值到UI上”的评论:

还没有评论