Save Depth map as EXR

I’ll post the code for future reference in case someone else needs it

void ACaptureCamera::SaveSnapshot(UTextureRenderTarget2D* renderTarget, FString fileName)
{
	FString path = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()) + "Snapshots/";
	SavePicture(renderTarget, path + fileName + ".EXR");
}

void ACaptureCamera::SavePicture(UTextureRenderTarget2D* RenderTarget, FString Filename)
{
	if (RenderTarget == nullptr) return;

	TArray<FLinearColor> RawPixels;
	FTextureRenderTargetResource* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource();
	if (RenderTargetResource->ReadLinearColorPixels(RawPixels) == true)
	{
		TArray64<uint8> ImgData = RawPixelToPicture(RawPixels, RenderTarget->SizeX, RenderTarget->SizeY);
		FFileHelper::SaveArrayToFile(ImgData, *Filename);
	}
}

TArray64<uint8> ACaptureCamera::RawPixelToPicture(const TArray<FLinearColor>& RawPixels, int Width, int Height)
{
	if (RawPixels.Num() == 0 || RawPixels.Num() != Width * Height)
		return TArray64<uint8>();

	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	static TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::EXR);
	SIZE_T allocatedSize = RawPixels.GetAllocatedSize() * 8;
	ImageWrapper->SetRaw(RawPixels.GetData(), allocatedSize, Width, Height, ERGBFormat::RGBAF, 32);
	TArray64<uint8> ImgData = ImageWrapper->GetCompressed();
	return ImgData;
}
3 Likes