UE4截图方式一(利用USceneCaptureComponent2D组件截图)(C++程序) |
您所在的位置:网站首页 › 平面截图是什么意思 › UE4截图方式一(利用USceneCaptureComponent2D组件截图)(C++程序) |
目录
1、所需要准备的环境: Visual studio 2019,UE4.26 2、通过UE4新建一个C++的空白工程 3、在UE4中添加类(切记不要在 Visual studio新建,一定从UE4中新建) 4、 在ScreenShot.h中添加所需要的头文件: 5、ScreenShot.h文件中添加代码 6、在ScreenShot.cpp文件中添加代码实现以上两个函数 7、关卡蓝图中的实现 8、测试效果 9、代码说明: 交流qq: 1137221527 1、所需要准备的环境: Visual studio 2019,UE4.262、通过UE4新建一个C++的空白工程 3、在UE4中添加类(切记不要在 Visual studio新建,一定从UE4中新建) 设定类名为ScreenShot 以上的头文件可以从UE4官网的C++ API文档上可以找到 5、ScreenShot.h文件中添加代码 声明一个USceneCaptureComponent2D组件,并且暴露在蓝图中 UPROPERTY(Category = Default, VisibleAnywhere, BlueprintReadOnly) class USceneCaptureComponent2D* CaptureComponent2D;// 声明一个2D截图的组件USceneCaptureComponent2D这个 声明两个自定义的函数 UFUNCTION(BlueprintCallable) void ScreenShotToImage(const FString& InImagePath,const FVector2D& InRangeSize);//将截屏转换为相片 UFUNCTION(BlueprintCallable) void ColorToImage(const FString& InImagePath, TArrayInColor,int32 InWidth,int32 InHight);//将颜色数据提取 6、在ScreenShot.cpp文件中添加代码实现以上两个函数 在构造函数中创建一下所需要的组件 AScreenShot::AScreenShot() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; RootComponent = CreateDefaultSubobject(TEXT("RootComponent"));// 创建可附加内容的虚拟根组件。 CaptureComponent2D = CreateDefaultSubobject(TEXT("CaptureComponent2D")); // 创建2D相机 CaptureComponent2D->SetupAttachment(RootComponent);//将CaptureComponent2D绑定到RootComponent组件 } ScreenShotToImage函数的实现 void AScreenShot::ScreenShotToImage(const FString& InImagePath, const FVector2D& InRangeSize) { if (CaptureComponent2D && CaptureComponent2D->TextureTarget) { auto Lab = [=]() // 简单自动类型推断 { //获取randerTarget贴图资源 将颜色值全部放入FTextureRenderTargetResource中 FTextureRenderTargetResource* TextureRenderTargetResource = CaptureComponent2D->TextureTarget->GameThread_GetRenderTargetResource(); int32 Width = CaptureComponent2D->TextureTarget->SizeX;//获取高度 int32 Height = CaptureComponent2D->TextureTarget->SizeY;//获取宽度 TArray OutData;//声明一个Fcolor数组 TextureRenderTargetResource->ReadPixels(OutData); //读取像素点 ColorToImage(InImagePath, OutData, Width, Height);//写入到本地存成图片 }; FTimerHandle TimerHandle;//定义一个定时器 //0.001f后再解析图片写入本地 防止掉帧 GetWorld()->GetTimerManager().SetTimer(TimerHandle, Lab, 0.001f, false,0); } } ColorToImage函数实现 void AScreenShot::ColorToImage(const FString& InImagePath, TArray InColor, int32 InWidth, int32 InHight) { IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked("ImageWrapper"); FString Ex = FPaths::GetExtension(InImagePath); if (Ex.Equals(TEXT("jpg"),ESearchCase::IgnoreCase)|| Ex.Equals(TEXT("jpeg"), ESearchCase::IgnoreCase)) { TSharedPtrImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG); //往本地写,获取颜色数据,获取尺寸,获取长度,高度,格式rgb,8位 if (ImageWrapper->SetRaw(InColor.GetData(),InColor.GetAllocatedSize(),InWidth,InHight,ERGBFormat::BGRA,8)) { FFileHelper::SaveArrayToFile(ImageWrapper->GetCompressed(100), *InImagePath); } } else { TArrayOutPNG; for (FColor&color:InColor) { color.A = 255;//不写的画截屏的图片都是透明通道,就是透明的 } FImageUtils::CompressImageArray(InWidth, InHight, InColor, OutPNG); FFileHelper::SaveArrayToFile(OutPNG, *InImagePath); } } 在UE4中找到声明的组件,拖进去UE4中,此时面板中就会有一个组件出现 7、关卡蓝图中的实现 打开关卡蓝图 运行游戏,按下鼠标键“1” ,在电脑中打开工程文件夹,可以发现 123.jpg已经成功保存到本地 1、用auto Lab = [=]()和定时组合的原因:如果直接截图,可能会出现掉帧现象,此时截出的图片就是黑色,所以一定要延时0.001秒再去截图。 2、for (FColor&color:InColor) { color.A = 255; }这个必须写,否则会出现透明通道,这个和PNG格式有关系 交流qq: 1137221527代码参考的UP主(吉叶子丶)的视频:UE4C++截图的几种方式(合集)_哔哩哔哩_bilibili |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |