今天测试使用UMP播放网络摄像头的数据。
处理截图的时候发现,显示摄像头图像的RawImage里面的图片保存不出来。
研究了很久才发现这个时候里面的texture数据应该是不可读,所以直接使用EncodeToJPG()函数没有用。
需要把这个Texture2D的数据转成可读的,方法如下
// 复制出可读的Texture2D
private Texture2D CopyT2DToWrite(Texture2D source)
{
// 先把Texture2D转成临时的RenderTexture
RenderTexture renderTex = RenderTexture.GetTemporary(
source.width,
source.height,
0,
RenderTextureFormat.Default,
RenderTextureReadWrite.Linear);
Graphics.Blit(source, renderTex);
RenderTexture previous = RenderTexture.active;
RenderTexture.active = renderTex;
// 复制进新的Texture2D
Texture2D readableText = new Texture2D(source.width, source.height);
readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
readableText.Apply();
// 恢复_释放 RenderTexture
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(renderTex);
return readableText;
}
将RawImage的贴图保存进入文件的代码如下
// 检测并创建文件所在的目录
private void CheckAndCreateFileDir( string filePathName)
{
// 检测并创建待写入的路径
string dir = Path.GetDirectoryName( filePathName);
if(!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
}
// 保存
private void SaveToFile( string fullPathName)
{
// 获取RawImage中的texture
Texture2D tex = (Texture2D)m_videoImg.texture;
// 转到可读
Texture2D t2d = CopyT2DToWrite( tex);
byte[] imageTytes = t2d.EncodeToJPG();
//存储
CheckAndCreateFileDir( fullPathName);
File.WriteAllBytes( fullPathName, imageTytes);
}
参考文章:
如何通过脚本使Texture2D可读_桔子。。的博客-CSDN博客
|