最近项目需要在unity中大量截图来写方案,于是就有了这样一个快速截图的需求,就研究了一下,给大家写下来,顺便加深以下理解。话不多说,直接开始。
public Texture2D Watermark;//水印
public Camera m_mainCamera;//主摄像机
public string m_targetDirectory; //储存目录
public int m_targetWidth = 1920; //默认生成图片的大小
public int m_targetHeight = 1080;
public IEnumerator Capture()
{
RenderTexture rt = new RenderTexture(m_targetWidth, m_targetHeight, 24);
m_mainCamera.targetTexture = rt;
Texture2D screenShot = new Texture2D(m_targetWidth, m_targetHeight, TextureFormat.RGB24, false);
m_mainCamera.Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, m_targetWidth, m_targetHeight), 0, 0);
m_mainCamera.targetTexture = null;
RenderTexture.active = null; // JC: added to avoid errors
Destroy(rt);
//加水印
screenShot= AddWatermark(screenShot,Watermark);
//获取到图片之后则将其保存下来
yield return new WaitForEndOfFrame(); //使用协程的原因后
byte[] byt = screenShot.EncodeToPNG();
string filename = ScreenShotName(m_targetWidth, m_targetHeight);
using (Stream stream = File.Create(filename))
{
stream.Write(byt, 0, byt.Length);
stream.Close(); //文件读写后记得将其关闭,以免出现进程占用的问题
stream.Dispose();
AssetDatabase.Refresh();//刷新文件夹
}
public Texture2D AddWatermark(Texture2D background, Texture2D watermark)
{
int startX = background.width - watermark.width - 10;
int endX = startX + watermark.width;
//int startY = background.height - watermark.height - 20;
int startY = 8;
int endY = startY + watermark.height;
for (int x = startX; x < endX; x++)
{
for (int y = startY; y < endY; y++)
{
Color bgColor = background.GetPixel(x, y);
Color wmColor = watermark.GetPixel(x - startX, y - startY);
Color final_color = Color.Lerp(bgColor, wmColor, wmColor.a / 1.0f);
background.SetPixel(x, y, final_color);
}
}
background.Apply();
return background;
}