版权声明:本文为CSDN博主「土豆大王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
最近武汉疫情严重,在家没事,做一个保存截图的功能。话不多说,直接上步骤和代码
具体步骤
- 我这里是新建的一个 Character 蓝图作为载体,也可以建立其他 actor 蓝图,添加 SceneCapture Componenet2D 组件
- 修改右侧属性 CaptureSource 设置为
Final color (LDR) in RGB,如下图
- 同时创建专用贴图并指定上去
- 双击打开贴图设置参数(因为我不需要太大的分辨率,所以就设置
1280x720的,RenderTarget Format 不需要更改【最后贴出的自定义代码里有控制,调节 gamma 值增强亮度】
- 引擎默认有一个导出的节点(4.23),但是导出后的 png 图片颜色有偏差,所以决定自己重写
- 新建 C++ 蓝图类
- 添加代码
- 编译完成
完整代码
.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;
}