- 调用Unity API
ScreenCapture.CaptureScreenshot("screen.png", 0);
- 截图的图片仅能保存为png格式,且第一个形参必须加.png
- 第二个参数为设定分辨率,大于1的情况下会增加分辨率,如为4,则是默认分辨率的4倍
- 只能保存在Application.persistentDataPath目录下
- 函数本身只能截全屏,如果实在要截部分屏幕,可以通过在截图后,当作本地图片读取后,进行修改
- 使用Texture2D.ReadPixels方法,该方法可以将当前RenderTexture(如没有设置则是Screen)的数据读到某Texture2D中
- 代码
private IEnumerator CaptureScreenshot2(Rect rect)
{
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
yield return new WaitForEndOfFrame();
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
byte[] bytes = screenShot.EncodeToPNG();
string filename = Application.dataPath + "/Screenshot.png";
System.IO.File.WriteAllBytes(filename, bytes);
}
- 这里必须使用Coroutine,并且在当前帧渲染后调用ReadPixels,因为这时候当前RenderTexture中才有图像
- Rect的不同控制了截图的范围
如
StartCoroutine(CaptureScreenshot2(new Rect(0, 0, Screen.width/2, Screen.height/2)));
则从左下角截屏幕宽度和高度各一半的图
- 改良版方法2,方法2中ReadPixels默认读取的是RenderTexture.active当没有手动设置时,该值为屏幕图像,这里我们可以通过设置Rendertexture来只截某个摄像机看到的镜像
- 前期准备,新增一个Camera,且该Camera仅渲染UI,为了不遮挡第一个摄像机渲染的物体,这里ClearFlag设置为Don‘t Clear
此时场景中有两个摄像机
- 代码
思路为创建一个renderTexture,并通过camera渲染,然后装填该RenderTexture后,通过ReadPixels读取
private void CaptureCamera(Camera camera, Rect rect)
{
RenderTexture _renderTex = new RenderTexture((int)rect.width, (int)rect.height, 0);
camera.targetTexture = _renderTex;
camera.Render();
camera.targetTexture = null;
RenderTexture.active = _renderTex;
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
RenderTexture.active = null;
byte[] bytes = screenShot.EncodeToPNG();
string filename = Application.dataPath + "/Screenshot.png";
System.IO.File.WriteAllBytes(filename, bytes);
}
- 调用该函数,并且传递的Camera参数为仅渲染UI的Camera,并且全屏截图,这里为了让结果更明显,我们将UI字体设为了红色,结果如下
参考