Savegame Menu With Screenshot Thumbnails

Here’s my new approach to saving the screenshots. First, the blueprint:


Next, the C++ SaveScreenshot function:

bool USaveGametFunctionLibrary::SaveScreenshot(
class USceneCaptureComponent2D* Target,
const FLinearColor ClearColour,
const FString SaveGameName)
{
if ((Target == nullptr) || (Target->TextureTarget == nullptr))
{
return false;
}

FRenderTarget* RenderTarget = Target->TextureTarget->GameThread_GetRenderTargetResource();
if (RenderTarget == nullptr)
{
return false;
}

TArray<FColor> RawPixels;

// Format not supported - use PF_B8G8R8A8.
if (Target->TextureTarget->GetFormat() != PF_B8G8R8A8)
{
UE_LOG(LogTemp, Warning, TEXT(“Format not supported - use PF_B8G8R8A8.”));
return false;
}

if (!RenderTarget->ReadPixels(RawPixels))
{
return false;
}

// Convert to FColor.
FColor ClearFColour = ClearColour.ToFColor(false); // FIXME - want sRGB or not?

for (auto& Pixel : RawPixels)
{
// Switch Red/Blue changes.
const uint8 PR = Pixel.R;
const uint8 PB = Pixel.B;
Pixel.R = PB;
Pixel.B = PR;

// Set alpha based on RGB values of ClearColour.
Pixel.A = ((Pixel.R == ClearFColour.R) && (Pixel.G == ClearFColour.G) && (Pixel.B == ClearFColour.B)) ? 0 : 255;
}

IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName(“ImageWrapper”));
TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);

const int32 Width = Target->TextureTarget->SizeX;
const int32 Height = Target->TextureTarget->SizeY;

if (ImageWrapper.IsValid() && ImageWrapper->SetRaw(&RawPixels[0], RawPixels.Num() * sizeof(FColor), Width, Height, ERGBFormat::RGBA, 8))
{
FFileHelper::SaveArrayToFile(ImageWrapper->GetCompressed(), *GetSaveGameScreenshotName(SaveGameName));
return true;
}

return false;
}