【转载】UE4 保存 RenderTarget 到桌面

1,263 阅读1分钟

版权声明:本文为CSDN博主「土豆大王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/u011407338/…

最近武汉疫情严重,在家没事,做一个保存截图的功能。话不多说,直接上步骤和代码

具体步骤

  1. 我这里是新建的一个 Character 蓝图作为载体,也可以建立其他 actor 蓝图,添加 SceneCapture Componenet2D 组件

image.png

  1. 修改右侧属性 CaptureSource 设置为 Final color (LDR) in RGB,如下图

image.png

  1. 同时创建专用贴图并指定上去

image.png

  1. 双击打开贴图设置参数(因为我不需要太大的分辨率,所以就设置 1280x720 的,RenderTarget Format 不需要更改【最后贴出的自定义代码里有控制,调节 gamma 值增强亮度

image.png

  1. 引擎默认有一个导出的节点(4.23),但是导出后的 png 图片颜色有偏差,所以决定自己重写

image.png

  1. 新建 C++ 蓝图类

image.png

image.png

  1. 添加代码

image.png

image.png

  1. 编译完成

image.png

完整代码

.h 部分

#pragma once

#include "ImageUtils.h"

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

/**
 * 
 */
UCLASS()
class ROBOTDESIGNER_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    // 保存 UTextureRenderTarget2D 到本地文件
    UFUNCTION(BlueprintCallable, meta = (DisplayName = "SaveRenderTargetToFile", Keywords = "SaveRenderTargetToFile"), Category = "SaveToFile") static bool SaveRenderTargetToFile(UTextureRenderTarget2D *rt, const FString &fileDestination);
};
 

.cpp 部分

#include "MyBlueprintFunctionLibrary.h"

#include "Engine/TextureRenderTarget2D.h"
#include "Misc/FileHelper.h"
bool UMyBlueprintFunctionLibrary::SaveRenderTargetToFile(UTextureRenderTarget2D *rt, const FString &fileDestination)
{
    FTextureRenderTargetResource *rtResource = rt->GameThread_GetRenderTargetResource();
    FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);

    TArray<FColor> outBMP;

    for (FColor &color : outBMP)
    {
        color.A = 255;
    }
    
    outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());
    rtResource->ReadPixels(outBMP, readPixelFlags);

    FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight());
    TArray<uint8> CompressedBitmap;
    FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap);
    bool imageSavedOk = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination);

    return imageSavedOk;
}