Unity实现全屏截图以及QQ截图

 更新时间:2020年04月16日 17:15:08   作者:丢丢思密达  
这篇文章主要为大家详细介绍了Unity实现全屏截图以及QQ截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity实现全屏截图、Unity实现QQ截图,供大家参考,具体内容如下

全屏截图:要实现的是点击鼠标左键,就实现截图,并且将所截图片保存到本地Assets目录下的StreamingAssets文件夹下面。

代码如下:

using UnityEngine;
using System.Collections;

public class TakeScreenShot : MonoBehaviour {
void Update () {
//点击鼠标左键
if (Input.GetMouseButtonDown (0)) {
//开启协程方法
StartCoroutine (MyCaptureScreen ());

}
}
//我的截屏方法
IEnumerator MyCaptureScreen(){
//等待所有的摄像机和GUI被渲染完成。
yield return new WaitForEndOfFrame ();
//创建一个空纹理(图片大小为屏幕的宽高)
Texture2D tex = new Texture2D (Screen.width,Screen.height);
//只能在帧渲染完毕之后调用(从屏幕左下角开始绘制,绘制大小为屏幕的宽高,宽高的偏移量都为0)
tex.ReadPixels (new Rect (0,0,Screen.width,Screen.height),0,0);
//图片应用(此时图片已经绘制完成)
tex.Apply ();
//将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
byte[] result = tex.EncodeToJPG ();
//文件保存,创建一个新文件,在其中写入指定的字节数组(要写入的文件的路径,要写入文件的字节。)
System.IO.File.WriteAllBytes (Application.streamingAssetsPath+"/1.JPG",result);

}
}

之后思考一下,如何像qq截图那样,绘制一个截屏的矩形框只截取自己想要的部分呢?

using UnityEngine;
using System.Collections;
using System.IO;//引入IO流
public class NewBehaviourScript : MonoBehaviour {
//定义一个存储截屏图片的路径
string filePath;
void Start () {
//图片存储在StreamingAssets文件夹内。
filePath = Application.streamingAssetsPath + "/1.png";
}
Rect rect;
//截屏开始的位置
Vector3 s_pos;
//截屏结束的位置
Vector3 e_pos;
//是否绘制
bool isDraw;
void Update()
{
//按下鼠标左键时,记录当前鼠标的位置为开始截屏时的位置
if(Input.GetMouseButtonDown(0))
{
s_pos = Input.mousePosition;
}
//鼠标处于按下状态时
if(Input.GetMouseButton(0))
{
e_pos = Input.mousePosition;
//可以开始绘制
isDraw = true;
}
//抬起鼠标左键时,记录当前鼠标的位置为结束截屏时的位置
if(Input.GetMouseButtonUp(0))
{
//结束绘制
isDraw = false;
e_pos = Input.mousePosition;
//获取到截屏框起始点的位置,和宽高。
rect = new Rect(Mathf.Min(s_pos.x,e_pos.x),Mathf.Min(s_pos.y,e_pos.y),Mathf.Abs(s_pos.x-e_pos.x),Mathf.Abs(s_pos.y - e_pos.y));
//开启绘制的协程方法
StartCoroutine(Capsture(filePath, rect));
}
}


IEnumerator Capsture(string filePath, Rect rect)
{
yield return new WaitForEndOfFrame();
//创建纹理(纹理贴图的大小和截屏的大小相同)
Texture2D tex = new Texture2D((int)rect.width, (int)rect.height);
//读取像素点
tex.ReadPixels(rect, 0, 0) ;
//将像素点应用到纹理上,绘制图片
tex.Apply();
//将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
byte[] result =tex.EncodeToPNG();
//文件夹(如果StreamAssets文件夹不存在,在Assets文件下创建该文件夹)
if(!Directory.Exists(Application.streamingAssetsPath))
Directory.CreateDirectory(Application.streamingAssetsPath);
//将截屏图片存储到本地
File.WriteAllBytes(filePath, result);
}
//在这里要用GL实现绘制截屏的矩形框
//1.GL的回调函数
//2.定义一个材质Material
public Material lineMaterial;

void OnPostRender() {
if(!isDraw) return;
print (s_pos);

Vector3 sPos = Camera.main.ScreenToWorldPoint(s_pos + new Vector3(0, 0, 10));
Vector3 ePos = Camera.main.ScreenToWorldPoint(e_pos + new Vector3(0, 0, 10));

print(string.Format("GL.....{0}, {1}", sPos, ePos));
// Set your materials Done
GL.PushMatrix();
// yourMaterial.SetPass( );
lineMaterial.SetPass(0);//告诉GL使用该材质绘制
// Draw your stuff
//始终在最前面绘制
GL.invertCulling = true;
GL.Begin(GL.LINES);//开始绘制

//GL.Vertex(sPos);
//GL.Vertex(ePos);
//如果想要绘制,矩形,将下面代码启动
GL.Vertex(sPos);
GL.Vertex(new Vector3(ePos.x, sPos.y, 0));


GL.Vertex(new Vector3(ePos.x, sPos.y, 0));
GL.Vertex(ePos);

GL.Vertex(ePos);
GL.Vertex(new Vector3(sPos.x, ePos.y, 0));

GL.Vertex(new Vector3(sPos.x, ePos.y, 0));
GL.Vertex(sPos);
GL.End();//结束绘制

GL.PopMatrix();
}

}

在脚本组件中拖入材质球

此图片黑色的矩形框就是通过GL绘制出来的(通过记录点的位置来依次绘制出线)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#之Expression表达式树实例

    C#之Expression表达式树实例

    这篇文章主要介绍了C#之Expression表达式树,包括了表达式树的原理与用法技巧,需要的朋友可以参考下
    2014-10-10
  • C#实现Word转换TXT的方法详解

    C#实现Word转换TXT的方法详解

    这篇文章主要为大家详细介绍了如何利用C#实现Word转换TXT的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#编程中最容易犯的7种编写错误分享

    C#编程中最容易犯的7种编写错误分享

    编程时犯错是必然的,这篇文章主要和大家来分享7个C#编程中最容易犯的7种编写错误,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • c#操作json示例分享

    c#操作json示例分享

    这篇文章主要介绍了c#操作json示例,需要的朋友可以参考下
    2014-03-03
  • C#使用GDI+实现生成验证码

    C#使用GDI+实现生成验证码

    这篇文章介绍了C#使用GDI+实现生成验证码的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C# 静态构造函数使用总结

    C# 静态构造函数使用总结

    今天花了一些时间把静态构造函数的用法总结了一下,希望高手们指点。谢谢
    2013-03-03
  • C# 使用HttpClient模拟请求的案例

    C# 使用HttpClient模拟请求的案例

    这篇文章主要介绍了C# 使用HttpClient模拟请求的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)

    C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)

    这里介绍将PDF转换多种不同格式的图像文件格式,如PNG,BMP,EMF,TIFF等,同时,转换文档也分为转换全部文档和转换部分文档为图片两种情况,本文也将作进一步介绍
    2018-02-02
  • C#调用摄像头实现拍照功能的示例代码

    C#调用摄像头实现拍照功能的示例代码

    这篇文章主要介绍了C#调用摄像头实现拍照功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • WPF调用Matlab函数的方法

    WPF调用Matlab函数的方法

    这篇文章主要为大家详细介绍了WPF调用Matlab函数的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论