Unity3D截图功能总结,并保存在指定的文件夹

快过新年了,一直在加班赶项目,没时间写博客,今天上班最后一天,就休息过年了,将我强几天在做一个截图功能分享出来,网上查了很多,但是都是在Unity Editor下好使,能截图,并显示出来,但是,在Android下,截图成功,并能显示出来,但是就是存不到手机相册中,找了很多原因不知道怎么回事,查阅各种资料最终解决了。我总结了一下,我用过的方法,希望大家 能够用的上。

第一种方法:

使用Application类下的CaptureScreenshot方法。但是我觉得这并不好用,不随意。不能针对某一个相机(camera)的画面,进行截图。对局部画面截图,实现起来不方便,效率也低。

   using System.Windows.Forms;
   
   //截图保存在电脑C盘中,安卓的我没想出用这中方法截图怎么保存到手机
   if (Input .GetMouseButtonDown (0)) {
     SaveFileDialog save = new SaveFileDialog(); 
     save.InitialDirectory = "c:\\";
      save.Filter = "Image Files(*.JPG;*.BMP;*.PNG)|*.JPG;*.BMP;*.PNG|All files (*.*)|*.*";
           DialogResult result = save.ShowDialog();
           if (result == DialogResult.OK) {
             string path = save.FileName;
      //EditorUtility.SaveFilePanel也可以实现保存,但是只能在Unity Editor下运行。
             Application.CaptureScreenshot(path);
           }
       }

Android下, Application.CaptureScreenshot();  截图保存在沙河中,大家可以看一看  ,讲的很清楚:          http://jingpin.jikexueyuan.com/article/30470.html

第二种方法:采用的是new Texture2D来截取图片分为截取一部分和全屏;

//截取一块区域,通过鼠标点击的点来获取要截取的区域;

using UnityEngine;  
using System.Collections;  
using System.IO;  

public class ShotScreenPicture : MonoBehaviour  
{  
  
    Texture2D image;  
    Texture2D cutImage;  
    WWW www;  
    Rect rect;  
    float time;  
    Vector2 pos1;  
    Vector2 pos2;  
  
    // Update is called once per frame  
    void Update()  
    {  
        //点击鼠标左键,记录第一个位置  
        if (Input.GetMouseButtonDown(0))  
        {  
            pos1 = Input.mousePosition;  
            time = Time.time;  
            if (time > 1f)  
            {  
                Debug.Log(pos1);  
            }  
        }  
        //放开左键记录第二个位置  
        if (Input.GetMouseButtonUp(0))  
        {  
            pos2 = Input.mousePosition;  
            Debug.Log(pos2);  
            StartCoroutine(CutImage());  
            time = 0;  
        }  
    }  
  
    void OnGUI()  
    {  
        //当下载完成  
        if (www.isDone)  
        {  
            GUI.DrawTexture(new Rect(0, 0, 600, 904), image);  
        }  
  
        GUI.Button(new Rect(0, 0, 100, 50), "W" + Screen.width + "H" + Screen.height);  
  
        if (pos1 != null)  
        {  
            GUI.Button(new Rect(0, 50, 150, 50), pos1.ToString());  
        }  
        if (pos2 != null)  
        {  
            GUI.Button(new Rect(0, 100, 150, 50), pos2.ToString());  
        }  
        if (cutImage != null)  
        {  
            GUI.Button(new Rect(0, 150, 150, 50), "image W" + cutImage.width + "H" + cutImage.height);  
        }  
  
        if (rect != null)  
        {  
            GUI.Button(new Rect(0, 200, 250, 50), rect.ToString());  
        }  
    }  
    //截图  
    IEnumerator CutImage()  
    {  
        //图片大小  
        cutImage = new Texture2D((int)(pos2.x - pos1.x), (int)(pos1.y - pos2.y), TextureFormat.RGB24, true);  
  
  
        //坐标左下角为0  
        rect = new Rect((int)pos1.x, Screen.height - (int)(Screen.height - pos2.y), (int)(pos2.x - pos1.x), (int)(pos1.y - pos2.y));  
  
        yield return new WaitForEndOfFrame();  
        cutImage.ReadPixels(rect, 0, 0, true);   
          
        cutImage.Apply();  
        yield return cutImage;  
        byte[] byt = cutImage.EncodeToPNG();  
        //保存截图  
        //如果是Andriod平台,可以把Application.streamingAssetsPath换成destination = "/sdcard/DCIM/Camera";
        File.WriteAllBytes(Application.streamingAssetsPath + "/CutImage.png", byt);  
    }  
}
 //全屏截图
 //存储路径
    private string Path_save;
    //读取路径
    private string Path_read;
    private string filepath;
    private string destination;
    void Start()
    {
        filepath = Application.persistentDataPath + "/test.txt";
    }
    public void OnClickShot()
    {
        StartCoroutine(getTexture2d());
    }
    IEnumerator getTexture2d()
    {
        //隐藏UI
       .................................
        //截图操作
        yield return new WaitForSeconds(0.1f);
        Texture2D t = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        //显示UI
        .......................
     
        t.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, true);
        byte[] bytes = t.EncodeToPNG();
        t.Compress(true);
        t.Apply();
        img.texture = t;
        //t就是截到的图片我们可以在这里上传到服务器
        //下面是开始保存
        //获取系统时间
        System.DateTime now = new System.DateTime();
        now = System.DateTime.Now;
        string filename = string.Format("image{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);
        //记录每一个截图名字
        StreamWriter sw;
        FileInfo ft = new FileInfo(filepath);
        la[1].text = filename;
        if (!ft.Exists)
        {
            sw = ft.CreateText();
        }
        else
        {
            sw = ft.AppendText();
        }
        sw.WriteLine(filename);
        sw.Close();
        sw.Dispose();
        //应用平台判断,路径选择
        if (Application.platform == RuntimePlatform.Android)
        {
            string origin = Path_save;
            //保存在Android相册中,如果是PC就改成Application .dataPath 的路径
            destination = "/sdcard/DCIM/Camera";
            if (!Directory.Exists(destination))
            {
                Directory.CreateDirectory(destination);
            }
            destination = destination + "/" + filename;
            Path_save = destination;

        }
        //保存文件
        File.WriteAllBytes(Path_save, bytes);
    }

第三种方法:有一个截图插件,在附件即可下载;

snapShot.CaptureAndSaveToAlbum();

即可截图成功,包含了选区域和全屏截图。

【注意】第二种和第三种保存在Android下的手机相册中,都要在发布的时候改成安卓默认路径


时间: 2024-10-12 21:08:46

Unity3D截图功能总结,并保存在指定的文件夹的相关文章

每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容

前言: 这里主要是针对列表中的文件下新增子项的操作,同时在新建子项时,可以为子项指定特定的内容类型,在某些时候需要查询指定的文件夹下的内容,针对这些场景都一一给力示例和说明,都是一些很小的知识点,希望能够对大家有所帮助. 1.   在列表中为列表项添加子项 为列表添加子项大家都很熟悉,但是如何为列表项添加子项呢?例如列表项是一个文件夹,如何为该文件夹添加子项呢?这里就用到了List.AddItem()方法,具体示例如下: 首先我们要获取列表中的子项: SPListItem root_item=l

Sublime Text 查找时排除指定的文件夹或文件

Sublime Text 查找时排除指定的文件夹或文件 Ctrl + Shift + F 这组快捷键可以调出 Sublime Text 的查找替换窗口,里边有一栏 Where,可以做一些高级设置: d:\dir\ , -*.css, -/*debug/* , -*.cache D:\Projects\ 表示在该目录下寻找,也可以写多个目录 *.cs 表示找 cs 后缀的文件,也可以写多个后缀 -/*Debug/* 表示排除 Debug 文件夹内的所有文件 -*.cache 表示排除 cache

[Android]用图库打开指定的文件夹,没错是第一个画面直接是图库的文件夹画面

参考了这个里面的代码 http://bbs.csdn.net/topics/380084274 一直报错 06-16 23:58:50.698 26148-26161/com.example.myapplication.app W/ContentResolver﹕ Failed to get type for: content://media/external/images/media/120818 (Unknown URL : content://media/external/images/m

怎么用dos命令进入指定的文件夹

在正常开发中经常需要我们进入指定的文件夹下面的例子演示了进入这个文件夹D:\portal\liferay-portal-tomcat-5.5-4.4.0的dos命令 win+R---->输入cmd进入dos命令端.

指定一个文件夹自动计算出其总容量 并且进行目录下文件的添加 与指定文件的访问

代码实现: //编写一个程序,指定一个文件夹,能自动计算出其总容量import java.io.*;public class Denglu { public static void main(String[] args) throws IOException { try { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader inp=new BufferedReader(isr);//进行字节字符转换 用于

Navicat for MySQL 新建查询时,报can't create file ...系统找不到指定的文件夹出现问题

如图点击新建查询报错 解决办法 将这个路径修改一下就ok了 Navicat for MySQL 新建查询时,报can't create file ...系统找不到指定的文件夹出现问题 原文地址:https://www.cnblogs.com/perfei456/p/8576944.html

利用python找出两文件夹里相同的文件并保存在新的文件夹下(分三种情况)

原文件夹A,B,新文件夹C,下图中的情况以图片为例 A:00001.jpg  00002.jpg   00003.jpg  00147.jpg B : 00001.jpg  000000002.jpg   00147.json 第一种情况:找出两文件夹下相同内容的文件,保存并输出到文件夹C 思路:判断内容是否一致,因此需要读取整个文件,判断两者是否一样 由于文件内容错综复杂,而其md5是唯一的,如果两者内容一致,则两者的md5值应该为一样.由于图片是二进制存储,在读取时采用'rb'.这里是对文件

编写一个程序,指定一个文件夹,能自动计算出其总容量

package wenjianyuliu;//编写一个程序,指定一个文件夹,能自动计算出其总容量import java.io.File;import java.util.ArrayList; public class Size {   static long size=0; private static ArrayList<String> filelist=new ArrayList<String>(); public static void main(String[] args)

linux复制文件到指定的文件夹

copy命令      该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中. 该命令的各选项含义如下: - a 该选项通常在拷贝目录时使用.它保留链接.文件属性,并递归地拷贝目录,其作用等于dpR选项的组合. - d 拷贝时保留链接. - f 删除已经存在的目标文件而不提示. - i 和f选项相反,在覆盖目标文件之前将