昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心


UE4 如何将TextureRenderTarget2D保存为本地图片

如果想要将材质保存为本地Png,请点这里:

UE4 如何将材质Material保存为本地图片Png

关于如何保存TextureRenderTarget2D,从虚幻4的回答中心中,一搜就搜到了这篇文章:
TextureRenderTarget2D saved to PNG is much darker

里面提供了一个保存TextureRenderTarget2D到本地PNG的方法,我把它写进了一个蓝图函数库里面:
BlueprintFunctionBPLibrary.h中:

#include "Runtime/Engine/Public/ImageUtils.h"
UCLASS()
class UBlueprintFunctionBPLibrary : public UBlueprintFunctionLibrary
{GENERATED_UCLASS_BODY()//保存UTextureRenderTarget2D到本地文件UFUNCTION(BlueprintCallable, meta = (DisplayName = "SaveRenderTargetToFile", Keywords = "SaveRenderTargetToFile"), Category = "SaveToFile")static bool SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination);
};

BlueprintFunctionBPLibrary.cpp中:

#include "BlueprintFunctionBPLibrary.h"
#include "BlueprintFunction.h"
bool UBlueprintFunctionBPLibrary::SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination)
{FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);TArray<FColor> outBMP;outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());rtResource->ReadPixels(outBMP, readPixelFlags);FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight());TArray<uint8> CompressedBitmap;FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap);bool imageSavedOk = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination);return imageSavedOk;
}

可以看到引擎中效果图:

和保存的a.png图:

对比上面两张图,感觉明显不对。感觉透明通道有很大的问题

上面那篇文章也说了,保存的图颜色比引擎中看到的要淡很多,如下图:

*注意:上面这一步我理解错了,人家说的Darker,不是我遇到的这个问题,详见这里:UE4 如何将材质Material保存为本地图片Png

我这边的问题暴露的更严重,感觉透明通道都不正常了(很感谢暴露得很严重的问题)

如果,能有可以看到图像像素数据的工具就好了…
还别说,还真有,感谢我吧。
先做一个UE4的OpenCV的插件,可以参考我这篇博客:
UE4使用第三方库Ⅱ
https://blog.csdn.net/lunweiwangxi3/article/details/83187840

里面就是以做OpenCV插件为例的
OpenCV第三方库下载地址:
https://download.csdn.net/download/lunweiwangxi3/10960604
我设置不了免费,穷人可评论发邮箱,免费传

在OpenCV插件库制作完成后,
在需要用到该插件的地方,打开xx. .Build.cs文件

在UBlueprintFunctionBPLibrary.cpp文件中,添加头文件
//opencv
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"

把OpenCV的Bin目录下的文件,全部拷贝到项目> Binaries>Wn64目录下:

修改SaveRenderTargetToFile函数中的代码如下所示:

bool UBlueprintFunctionBPLibrary::SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination)
{FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);TArray<FColor> outBMP;outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());rtResource->ReadPixels(outBMP, readPixelFlags);cv::Mat viewTmp = cv::Mat(rt->GetSurfaceHeight(), rt->GetSurfaceWidth(), CV_8UC4);for (int y = 0; y < rt->GetSurfaceHeight(); y++){for (int x = 0; x < rt->GetSurfaceWidth(); x++){int i = x + (y * rt->GetSurfaceWidth());viewTmp.at<cv::Vec4b>(y, x) = cv::Vec4b(outBMP[i].B, outBMP[i].G, outBMP[i].R, outBMP[i].A);}}return true;
}

然后安装一个VS吊炸天的插件叫ImageWatch,操作如下

安装,期间要把VS软件关闭后才能继续。安装好,重新打开项目
在SaveRenderTargetToFile函数的最后一行( return true;)上下断点

运行VS,UE4项目,在运行SaveRenderTargetToFile时会暂停到断点处。
点击 视图>其他窗口>ImageWatch

RGBA四通道的值全都有!调试神器啊,仅限C++拥有。
注意:只能看到函数里的局部cv::Mat变量,只能在C++项目中有效,C#项目中显示不出。
结果显示Alpha值莫名奇妙的变成了0.罪魁祸首?我们猜想测试下
强制把Alpha通道设置成255试试呢,说干就干,
把这行代码:
viewTmp.at<cv::Vec4b>(y, x) = cv::Vec4b(outBMP[i].B, outBMP[i].G, outBMP[i].R, outBMP[i].A);
改成:
viewTmp.at<cv::Vec4b>(y, x) = cv::Vec4b(outBMP[i].B, outBMP[i].G, outBMP[i].R, 255);
老地方下断点,运行vs,ue4,运行SaveRenderTargetToFile函数,

然后将函数OpenCV调试图(左)和引擎效果图(右)作对比:

完美解决!
既然是改Alpha通道的值,那么,OpenCV作为我们的可视化调试工具的任务也圆满完成了,兔死狗烹,把OpenCV模块卸载掉,代码删掉。
在SaveRenderTargetToFile函数中添加代码:
 for (FColor& color : outBMP)
  color.A = 255;
最终如下图所示:

bool UBlueprintFunctionBPLibrary::SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination)
{FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);TArray<FColor> outBMP;outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());rtResource->ReadPixels(outBMP, readPixelFlags);for (FColor& color : outBMP)color.A = 255;FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight());TArray<uint8> CompressedBitmap;FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap);bool imageSavedOk = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination);return imageSavedOk;return true;
}

最后我们运行下保存图片,效果如下:

Perfect!
不要将就,只愿完美。

UE4 如何将TextureRenderTarget2D保存为本地图片相关推荐

  1. UE4 如何将材质Material保存为本地图片Png

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 UE4 如何将材质Material保存为本地图片Png 下面这篇文章讲了如何将TextureRenderTarget2D保存为本地图片 https:// ...

  2. canvas保存到本地图片三种方法

    canvas保存到本地图片三种方法 canvas保存本地图片 第一种方法(修改图片的媒体类型,window.open直接下载) 第二种方法(创建a标签,通过自己触发点击来下载) 第三种方法(将图片数据 ...

  3. WEB自动化(4)使用selenium将网站验证码截图保存为本地图片

    WEB自动化(1)环境安装及打开浏览器实例 WEB自动化(2)常用的元素定位方法之xpath详解 WEB自动化(3)PO设计模式原理与实现 WEB自动化(4)使用selenium将网站验证码截图保存为 ...

  4. 【Uni-App】点击分享,生成海报带二维码,保存到本地图片,写入文字

    目录 一:需求 二:分析 三:准备工作 1.qrcode准备 2.并且在main.js去挂载 四:页面构建 1.html 2.data 3.js 二维码嵌入文字 一:需求 1.产品需要这个商品,必须分 ...

  5. 三种保存电脑本地图片方法

    1这是我最开始存储图片到项目获取地址的方法用下面这个方法去获取我想要存地址结果很不理想,每次获取的是target下的目录,(ps:我用的是idea 发布用的是exploded包,不知道和这个有关系没) ...

  6. Java 视频截取帧数保存为本地图片及删除本地图片

    业务功能实现了通过视频URL截取帧数并保存为图片操作. 通过URL获取视频解析并获取其中某一帧数图片并转换为 base64字符串 并输入到对应位置保存操作,最终删除该保存的临时图片以及临时目录 pub ...

  7. c# 通过ImageSharp实现心电图数据保存为本地图片

    文章目录 一.实现结果 二.实现步骤(控制台应用)`控制台应用方便.直接将图片生成到本地` 三.完整代码 一.实现结果 二.实现步骤(控制台应用)控制台应用方便.直接将图片生成到本地 添加 NuGet ...

  8. android 看不见照片,android view保存为本地图片,微信看不到(部分适配,不能保证100%)...

    效果:红色框框 image.png 各位开发者: 最新版本(7.0.13)的微信 SDK 已经适配使用FileProvider的方式来进行消息分享. 如果分享的消息中涉及文件路径(如图片类型消息),建 ...

  9. php完美实现下载远程图片保存到本地(保存微信头像)

    2019独角兽企业重金招聘Python工程师标准>>> /** * php完美实现下载远程图片保存到本地 * @param: 文件url,保存文件目录,保存文件名称,使用的下载方式 ...

最新文章

  1. C++知识点13——友元,类的声明
  2. ASP.NET 2.0中如何连接到Mysql(转)
  3. Linux 学习之虚拟机下的网络连接
  4. ruby Rspec+jenkins+allure持续集成
  5. Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?
  6. VTK:可视化之SceneBounds
  7. Angular的HttpClient注入
  8. 写给初中级前端工程师的进阶指南
  9. (39) gulp开发服务器
  10. 什么是大数据分析及挖掘技术
  11. Laravel使用腾讯云COS服务
  12. Windows界面编程第十二篇 位图显示特效 飞入效果与伸展效果
  13. 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
  14. abaqus python提取楼层剪力_用Python提取ABAQUS中节点集合的反力
  15. 谢辉吉林大学计算机学院,【大科·数院】佳绩频传,成果丰硕——第12届中国大学生计算机设计大赛吉大赛区数院学子成绩斐然...
  16. 本周最新文献速递20220327
  17. My Visual DataBase(数据库编程软件)v5.3免费版
  18. 数一数你连听都没听过的古典小说有多少?
  19. SublimeText 设置全部保存快捷键
  20. 记住沃伦巴菲特这三十条

热门文章

  1. 初入Linux,M35作业第二弹,牛刀小试
  2. %p 打印地址?它打印的是变量值!什么是格式化输出,指针与地址的区别
  3. SAP报工时修改工作中心
  4. java 当年的的第一个月_Java获取当前日期前一周、前一个月、当年的时间、两个日期间的间隔...
  5. 计算机数值模拟仿真技术的优点,数值模拟的优缺点优点.ppt
  6. 16家上市车企2018年度中期经营业绩
  7. linux显示某一日期是第几天,如果已经知道一年中的第几天,能够用linux中date显示出所对应日期吗?比如知道今天是这一年的第...
  8. Java项目:汽车配件销售管理系统(java+SpringBoot+layui+html+maven+mysql)
  9. 控制理论中的稳定性总结
  10. 数模国赛备赛(6)数学建模中的图论方法