一、框选自由截屏
using UnityEngine;
using System.Collections;
using System.IO;
public class draw : MonoBehaviour
{
public Color rColor = Color.green;
private Vector3 start = Vector3.zero;
private Vector3 end = Vector3.zero;
private Material rMat = null;
private bool drawFlag = false;
private Rect rect;
private Texture2D cutImage;
// Use this for initialization
void Start()
{
rMat = new Material("Shader \"Lines/Colored Blended\" {" +
"SubShader { Pass { " +
" Blend SrcAlpha OneMinusSrcAlpha " +
" ZWrite Off Cull Off Fog { Mode Off } " +
" BindChannels {" +
" Bind \"vertex\", vertex Bind \"color\", color }" +
"} } }");//生成画线的材质
rMat.hideFlags = HideFlags.HideAndDontSave;
rMat.shader.hideFlags = HideFlags.HideAndDontSave;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
drawFlag = true;//如果鼠标左键按下 设置开始画线标志
start = Input.mousePosition;//记录按下位置
end = Input.mousePosition;//鼠标当前位置
}
else if (Input.GetMouseButtonUp(0))
{
drawFlag = false;//如果鼠标左键放开 结束画线
}
if (Input.GetKeyDown(KeyCode.P))
{
StartCoroutine(CutImage());
}
}
//绘制框选
void OnPostRender()
{//画线这种操作推荐在OnPostRender()里进行 而不是直接放在Update,所以需要标志来开启
if (drawFlag)
{
end = Input.mousePosition;//鼠标当前位置
}
GL.PushMatrix();//保存摄像机变换矩阵
if (!rMat)
return;
rMat.SetPass(0);
GL.LoadPixelMatrix();//设置用屏幕坐标绘图
GL.Begin(GL.QUADS);
GL.Color(new Color(rColor.r, rColor.g, rColor.b, 0.1f));//设置颜色和透明度,方框内部透明
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.End();
GL.Begin(GL.LINES);
GL.Color(rColor);//设置方框的边框颜色 边框不透明
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.Vertex3(start.x, start.y, 0);
GL.End();
GL.PopMatrix();//恢复摄像机投影矩阵
}
IEnumerator CutImage()
{
string date = System.DateTime.Now.ToString("yyyyMMddHHmmss");
//图片大小
cutImage = new Texture2D((int)(end.x - start.x), (int)(start.y - end.y), TextureFormat.RGB24, true);
//坐标左下角为0
rect = new Rect((int)start.x, Screen.height - (int)(Screen.height - end.y), (int)(end.x - start.x), (int)(start.y - end.y));
yield return new WaitForEndOfFrame();
cutImage.ReadPixels(rect, 0, 0, true);
cutImage.Apply();
yield return cutImage;
byte[] byt = cutImage.EncodeToPNG();
//保存截图
File.WriteAllBytes(Application.streamingAssetsPath + "/CutImage" + date + ".png", byt);
}
}
需要说明一下的是,框选的时候填充的有颜色,这样截图的时候,填充的颜色也带进去了。可以把
GL.LoadPixelMatrix();//设置用屏幕坐标绘图
GL.Begin(GL.QUADS);
GL.Color(new Color(rColor.r, rColor.g, rColor.b, 0.1f));//设置颜色和透明度,方框内部透明
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.End();
这段去掉,或者
GL.Color( new Color(rColor.r, rColor.g, rColor.b, 0.1f) );
二、相机截屏
/// <summary>
/// 相机截图
/// </summary>
/// <param name="camera">截屏相机</param>
/// <param name="rect">截屏区域</param>
/// <returns></returns>
public Texture2D CaptureCamera(Camera camera,Rect rect)
{
RenderTexture rt = new RenderTexture((int)rect.width,(int)rect.height,0);
camera.targetTexture = rt;
camera.Render();
RenderTexture.active = rt;
Texture2D screenShot = new Texture2D((int)rect.width,(int)rect.height);
screenShot.ReadPixels(rect,0,0);
screenShot.Apply();
camera.targetTexture = null;
RenderTexture.active = null;
Destroy(rt);
return screenShot;
}
/// <summary>
/// 设置截屏UI所需材质的值
/// </summary>
/// <param name="texture"></param>
public void SetMaterialValue(Texture texture)
{
ri.material.SetTexture("_MainTex",texture);
ri.color = new Color(ri.color.r, ri.color.g, ri.color.b, 1);
ri.gameObject.SetActive(true);
blurValue = 0;
}
//使用
SetMaterialValue(CaptureCamera(Camera.main,new Rect(0,0,800,600)));