UE4中实现截图功能并保存到指定路径

该博客介绍了如何在UE4引擎中实现截图功能,并详细说明了如何将截图保存为PNG格式。通过全局函数和变量完成操作,同时指出若要保存为JPEG格式,需要在XXX.build.cs文件中包含'ImageWrapper'模块。
摘要由CSDN通过智能技术生成

为方便起见,都是用全局函数和变量,而不是在类中实现

代码如下:

FDelegateHandle GCaptureHandle;
static void OnCaptureScreenshotComplete(int32 InWidth, int32 InHeight, const TArray<FColor>& InColors)
{
	FString ScreenShotName = FPaths::GameSavedDir() + TEXT("ScreenShot.png");
	TArray<uint8> CompressedBitmap;
	FImageUtils::CompressImageArray(InWidth, InHeight, InColors, CompressedBitmap);
	FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);
	UGameViewportClient::OnScreenshotCaptured().Remove(GCaptureHandle);
}

void CaptureScreenshot()
{
	if (GEngine && GEngine->GameViewport)
	{
		GCaptureHandle = UGameViewportClient::OnScreenshotCaptured().AddStatic(&OnCaptureScreenshotComplete);
		GEngine->GameViewport->Exec(nullptr, TEXT("HighResShot 1080x720"), *GLog);//分辨率可自己设定
	}
}

 

图片保存为png格式,如果想保存为jpg格式,可改为如下代码:


stati
可以参考以下步骤来创建一个具有截图保存功能的Actor: 1. 首先创建一个继承自Actor的子类,并在头文件添加以下include语句: ```cpp #include "Engine/TextureRenderTarget2D.h" #include "EngineUtils.h" ``` 2. 在子类添加以下成员变量: ```cpp UPROPERTY(EditAnywhere) int32 Width = 1024; UPROPERTY(EditAnywhere) int32 Height = 1024; UPROPERTY(EditAnywhere) FString SavePath = FPaths::ProjectSavedDir() + "Screenshots/"; UPROPERTY(EditAnywhere) FString FileNamePrefix = "Screenshot_"; ``` 这些变量将控制截图的大小、保存路径和文件名前缀。 3. 在子类添加以下函数: ```cpp void SaveScreenshot(UTextureRenderTarget2D* RenderTarget, const FString& FilePath); FString GetUniqueFilename(const FString& Prefix, const FString& Extension); ``` SaveScreenshot函数将保存截图指定路径,GetUniqueFilename函数将生成一个唯一的文件名。 4. 在子类的cpp文件实现以上两个函数: ```cpp void AMyActor::SaveScreenshot(UTextureRenderTarget2D* RenderTarget, const FString& FilePath) { TArray<FColor> Bitmap; FIntRect Rect(0, 0, RenderTarget->SizeX, RenderTarget->SizeY); RenderTarget->ReadPixels(Bitmap, FReadSurfaceDataFlags(), Rect); FString Filename = GetUniqueFilename(FileNamePrefix, ".png"); FString FullPath = FilePath + Filename; FFileHelper::CreateDirectory(*FilePath); FSaveImageDialog::SaveImage(FullPath, Rect.Width(), Rect.Height(), Bitmap.GetData(), nullptr); } FString AMyActor::GetUniqueFilename(const FString& Prefix, const FString& Extension) { FString Filename; int32 Number = 0; do { Filename = Prefix + FString::FromInt(Number++) + Extension; } while (FPlatformFileManager::Get().GetPlatformFile().FileExists(*Filename)); return Filename; } ``` 5. 在子类添加以下函数: ```cpp void CaptureScreenshot(); ``` 这个函数将截图保存指定路径。 6. 在子类的cpp文件实现CaptureScreenshot函数: ```cpp void AMyActor::CaptureScreenshot() { UWorld* World = GetWorld(); if (!World) { return; } TArray<AActor*> Actors; UGameplayStatics::GetAllActorsOfClass(World, APlayerController::StaticClass(), Actors); if (Actors.Num() == 0) { return; } APlayerController* PlayerController = Cast<APlayerController>(Actors[0]); if (!PlayerController) { return; } ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player); if (!LocalPlayer) { return; } UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>(); RenderTarget->ClearColor = FLinearColor::Black; RenderTarget->InitAutoFormat(Width, Height); RenderTarget->UpdateResourceImmediate(); FViewport Viewport(0, 0, Width, Height); FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues( Viewport, World->Scene, LocalPlayer->ViewportClient->EngineShowFlags) .SetRealtimeUpdate(true)); FSceneView* View = LocalPlayer->CalcSceneView(&ViewFamily); View->ViewRect = FIntRect(0, 0, Width, Height); View->UpdateViewMatrix(); View->SetScreenPercentage(100.0f); FTextureRenderTargetResource* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); View->Family->RenderInterface->Render(View, FTextureRHIRef(), FTextureRHIRef(), RenderTargetResource->GetRenderTargetTexture(), View->ViewRect, false); SaveScreenshot(RenderTarget, SavePath); } ``` 这个函数使用场景的第一个PlayerController来获取场景视图,并将其渲染到一个RenderTarget上,然后调用SaveScreenshot函数保存截图。 7. 最后,可以在Actor的BeginPlay函数调用CaptureScreenshot函数来测试截图功能: ```cpp void AMyActor::BeginPlay() { Super::BeginPlay(); CaptureScreenshot(); } ``` 这样就完成了一个具有截图保存功能的Actor。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值