以前,我希望将UE4呈现的帧输出到文件。
我成功完成了这项工作,详细信息可以在this StackOverflow post
中找到将帧放到文件中的功能是:
FScreenshotRequest::RequestScreenshot(filename, false, false);
现在,我想写入内存,而不是写入文件。我不想写入文件然后读入内存。
我一直在挖掘源代码,发现截图正在制作中,但遇到了一些麻烦。
在ViewportClient->ProcessScreenShots(this);
的1012
行上调用 UnrealClient.cpp
之后,我发现屏幕截图实际上是在这里生成的:
bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);
因此,在找到我认为需要的所有位后,我尝试在自定义Actor中重新创建它:
UGameViewportClient* gameViewport = GEngine->GameViewport;
FViewport* InViewport = gameViewport->Viewport;
TArray<FColor> Bitmap;
bool bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);
if (bScreenshotSuccessful){
FIntVector Size(InViewport->GetSizeXY().X, InViewport->GetSizeXY().Y, 0);
TArray<uint8> CompressedBitmap;
FString ScreenShotName = TEXT("out.png");
FImageUtils::CompressImageArray(Size.X, Size.Y, Bitmap, CompressedBitmap);
FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);
}
出于某种原因,bool bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);
会引发Access violation reading location 0x0000000000000020.
例外。
我认为该错误与此行有关:
Viewport->ReadPixels(Bitmap, FReadSurfaceDataFlags(), ViewRect)
我对'访问违规'的内容进行了'googeling',看起来它与空指针或类似东西有关,但我仍然无法解决这个问题,因为我是相当新的c ++。
问题
如何解决此问题以使bScreenshotSuccessful
成立?
注意:我意识到FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);
尝试保存到文件,尽管我说这不是我想要做的,所以请忽略它,好像我有位图,我可以压缩和流式传输。
答案 0 :(得分:1)
您的ViewRect只有三个点而不是四个,格式错误。试试这个片段:
FIntRect Rect(0, 0, InViewport->GetSizeXY().X, InViewport->GetSizeXY().Y);
bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap, Rect);