UE4截图功能

ue版本4.18

.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UENUM(BlueprintType)
enum class EImageFormatType : uint8
{
	/** Portable Network Graphics. */
	PNG ,

	/** Joint Photographic Experts Group. */
	JPEG ,

	/** OpenEXR (HDR) image file format. */
	EXR ,
};
UCLASS()
class A418_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	static void OnScreenshotCapturedInternal(int32 Width, int32 Height, const TArray<FColor>& Bitmap);
	UFUNCTION(BlueprintCallable, meta = (AdvancedDisplay = "1"), Category = "TalkCameraDebug")
	void TakeScreenShot(const FString fineName = FString(TEXT("ScreenShot")), EImageFormatType _format = EImageFormatType::PNG, 
		int32 _quality = 100, bool bInsertTimeStampToFileName = false, bool bInShowUI = false, bool bAddFilenameSuffix = false);
};


.cpp

#include "ImageUtils.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"


EImageFormatType format;
int32 quality;
FString fileName;
FDelegateHandle delegateHandle;

void AMyActor::OnScreenshotCapturedInternal(int32 Width, int32 Height, const TArray<FColor>& Bitmap)
{

	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
		TSharedPtr<IImageWrapper> ImageWrapper;
		if (format == EImageFormatType::PNG)
		{
			TArray<uint8> PNGData;
			TArray<FColor> BitmapCopy(Bitmap);
			FImageUtils::CompressImageArray(Width, Height, BitmapCopy, PNGData);
	
			fileName += ".png";
			FFileHelper::SaveArrayToFile(PNGData, *fileName);
		}
		else if (format == EImageFormatType::JPEG)
		{
			ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
			ImageWrapper->SetRaw(Bitmap.GetData(), Bitmap.GetAllocatedSize(), Width, Height, ERGBFormat::BGRA, 8);
			const TArray<uint8>& JPEGData = ImageWrapper->GetCompressed(quality);
			fileName += ".jpg";
			FFileHelper::SaveArrayToFile(JPEGData, *fileName);
		}
		else if (format == EImageFormatType::EXR)
		{
			ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::EXR);
			ImageWrapper->SetRaw(Bitmap.GetData(), Bitmap.GetAllocatedSize(), Width, Height, ERGBFormat::BGRA, 8);
			const TArray<uint8>& Data = ImageWrapper->GetCompressed(quality);
			fileName += ".exr";
			FFileHelper::SaveArrayToFile(Data, *fileName);
		}
		else
		{
			//默认使用Jpg格式
			ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
			ImageWrapper->SetRaw(Bitmap.GetData(), Bitmap.GetAllocatedSize(), Width, Height, ERGBFormat::BGRA, 8);
			const TArray<uint8>& JPEGData = ImageWrapper->GetCompressed(quality);
			fileName += ".jpg";
			FFileHelper::SaveArrayToFile(JPEGData, *fileName);
		}
		UGameViewportClient::OnScreenshotCaptured().Remove(delegateHandle);
		ImageWrapper.Reset();

}

void AMyActor::TakeScreenShot(const FString fineName /*= FString(TEXT("ScreenShot"))*/, EImageFormatType _format /*= EImageFormatType::PNG*/, 
	int32 _quality /*= 100*/, bool bInsertTimeStampToFileName /*= true*/, bool bInShowUI /*= true*/, bool bAddFilenameSuffix /*= true*/)
{



		FString filename = fineName;
	
		format = _format;
		quality = _quality;
	
		//名字后面加上现在的时间
		if (bInsertTimeStampToFileName)
		{
			filename += "_" + FDateTime::Now().ToString();
		}
		//名字后面加上下划线
		if (bAddFilenameSuffix)
		{
			filename += "_";
		}
	
		fileName = FPaths::ProjectSavedDir() + "ScreenShots/Windows/" + filename;
	
		if (!UGameViewportClient::OnScreenshotCaptured().IsBound())
		{
			delegateHandle = UGameViewportClient::OnScreenshotCaptured().AddStatic(&OnScreenshotCapturedInternal);
			
			FScreenshotRequest::RequestScreenshot(filename, bInShowUI, bAddFilenameSuffix);
			//加这个是高分辨率截图但是会有锯齿
			//GEngine->GameViewport->Exec(nullptr, TEXT("HighResShot 1080x720"), *GLog);
		}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤在UE4中创建一个Actor并实现截图保存功能: 1. 创建一个继承自Actor的C++类,例如命名为MyActor。 2. 在MyActor.h中添加以下头文件: ```c++ #include "Engine/TextureRenderTarget2D.h" #include "Engine/Texture2D.h" ``` 3. 声明一个TextureRenderTarget2D成员变量和一个Texture2D成员变量: ```c++ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Screenshot") UTextureRenderTarget2D* ScreenshotRenderTarget; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Screenshot") UTexture2D* ScreenshotTexture; ``` 4. 在MyActor.cpp中重写BeginPlay()函数,创建RenderTarget和Texture: ```c++ void AMyActor::BeginPlay() { Super::BeginPlay(); ScreenshotRenderTarget = UGameplayStatics::CreateRenderTarget2D(GetWorld(), 1920, 1080); ScreenshotTexture = UTexture2D::CreateTransient(1920, 1080); } ``` 5. 在MyActor.cpp中添加一个截图函数: ```c++ void AMyActor::TakeScreenshot() { if (ScreenshotRenderTarget != nullptr && ScreenshotTexture != nullptr) { FTextureRenderTargetResource* RenderTargetResource = ScreenshotRenderTarget->GameThread_GetRenderTargetResource(); FReadSurfaceDataFlags ReadPixelFlags(RCM_UNorm); ReadPixelFlags.SetLinearToGamma(true); TArray<FColor> OutBMP; RHIReadSurfaceData(RenderTargetResource->GetRenderTargetTexture(), FIntRect(0, 0, ScreenshotRenderTarget->SizeX, ScreenshotRenderTarget->SizeY), OutBMP, ReadPixelFlags); ScreenshotTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE); uint8* TextureData = (uint8*)ScreenshotTexture->PlatformData->Mips[0].BulkData.Realloc(OutBMP.Num() * 4); for (int32 i = 0; i < OutBMP.Num(); i++) { TextureData[i * 4 + 0] = OutBMP[i].B; TextureData[i * 4 + 1] = OutBMP[i].G; TextureData[i * 4 + 2] = OutBMP[i].R; TextureData[i * 4 + 3] = OutBMP[i].A; } ScreenshotTexture->PlatformData->Mips[0].BulkData.Unlock(); ScreenshotTexture->UpdateResource(); FString FileName = FPaths::ProjectSavedDir() + TEXT("Screenshots/MyScreenshot.png"); FFileHelper::SaveArrayToFile(ScreenshotTexture->PlatformData->Mips[0].BulkData, *FileName); } } ``` 6. 在MyActor.cpp中添加一个函数,用于在按下某个按键时调用截图函数: ```c++ void AMyActor::CaptureScreenshot() { TakeScreenshot(); } ``` 7. 在MyActor的Blueprint中添加一个InputComponent,将某个按键与CaptureScreenshot函数绑定即可。 完成以上步骤后,你就可以在UE4中创建一个Actor,并在其中实现截图保存功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值