遇到了一个特殊需求:我们需要给特定的widget进行截图,该widget正在播放一个视频
新建一个UFunctionLibrary类,我们使用FSlateApplication类里面的TakeScreenShot()函数进行截图。
具体代码如下:
void UShotFunctionLibrary::ShotWidget(UWidget* Widget)
{
TSharedRef <SWidget> TargetSWidget = Widget->TakeWidget();
TArray<FColor> RawData;
FIntVector OutSize;
FSlateApplication& FSA= FSlateApplication::Get();
bool bScreenShotSuccessful = FSA.TakeScreenshot(TargetSWidget, RawData, OutSize);
if (bScreenShotSuccessful) {
FString ScreenShotName = FPaths::ProjectSavedDir() + TEXT("ScreenShot.png");
TArray<uint8> CompressedBitmap;
FImageUtils::CompressImageArray(OutSize.X, OutSize.Y, RawData, CompressedBitmap);
FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);
}
}
注意,使用FSlateApplication类的时候,我们需要在build.cs文件内对Slate模块进行引用。否则会出现无法解析函数的error。