欢迎光临散文网 会员登陆 & 注册

Unity中保存TextureFormat为Alpha8的灰度图时,直接保存是透明图的处理

2022-01-31 18:30 作者:TenderRain-  | 我要投稿

记个笔记,如果大佬有更好的方式可以指出,谢谢

先说下我因为一个VR项目需要保存设备头盔上的灰度摄像头的画面,因为显示是设备的SDK中提供的,显示出来的是正常的灰度图,就想当然的通过常规的方法保存图片。结果发现保存下来的JPG图是纯黑的图,保存的PNG和TGA都是大部分透明的图(现在写笔记没有设备所以就附上图片了,后续有空再补上吧)后面我先说下原因,最后会放上我的解决方案和代码。

接下来说下我碰到的是什么原因造成这样的,原因是设备安卓层传上来的画面数据是Alpha8的,通过Texture2D加载后再unity中显示会正常显示灰度画面,但是实际上每一帧图片的每个像素点的RGB都是(1,1,1)或者(0,0,0),只有每一个像素点的Alpha值是不一样的,因此保存JPG格式时因为没有透明通道所以不保存alpha值,所以显示的是全黑的,当保存有透明通道的PNG或者TGA时就变成都是透明图了。

解决方案很简单,但是需要了解灰度图是怎么产生的,这边简单说下,普通的图片基本都是RGB(红绿蓝)三基色组成或者RGBA(红绿蓝透明值)三基色加一个透明值组成,灰度图其实就是让RGB三种颜色的数值相等就行,所以常见的生成灰度图有三种方法:1、最大值法,2、平均值法,3、加权平均值法,这里就不扩展了讲了,感兴趣的可以自己查查这资料还是很多的。

前面说了这么多其实就是让我们生成一张我们能保存的灰度图就行了,把从安卓层传上来的Alpha值赋给RGB三个颜色,Alpha值等于1就能生成一张我们引擎中看到的灰度图了。下面直接说我的做法。

第一种做法,保存时修改图片的每一个像素点数据,再进行保存,代码如下,但是这个做法如果图片分辨率太高会卡死主线程,建议下面协程、异步或者多线程处理。(这种做法很消耗时间,不建议使用)

第二种是通过Shader叠加来生成一张想要的灰度图,方法也很简单,拿到图片数据后通过Graphics.Blit(pngTexture, GrayMaterial);方法叠加一个材质球再保存图片即可,下面是代码

下面是shader的代码,其实和灰度图shader一样,只不过在处理rgba数值时修改一下就行。

本篇内容到这里就结束了,如果有大佬有更好的方法欢迎评论私信提供。谢谢

最后放一个我封装好的导出文件的方法,也是前面保存图片时用到的ExportFile方法


Unity中保存TextureFormat为Alpha8的灰度图时,直接保存是透明图的处理的评论 (共 条)

分享到微博请遵守国家法律