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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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下的手机相册中,都要在发布的时候改成安卓默认路径


技术分享

本文出自 “Unity_3D技术探讨” 博客,请务必保留此出处http://caoliyong.blog.51cto.com/9944020/1740642

以上是关于Unity3D截图功能总结,并保存在指定的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d中的几种截图方法

mac如何截屏并保存

在 Unity3D 中创建一个屏幕截图按钮,它可以显示在手机图库中

Unity3D 问题总结Unity报错提示:InvalidOperationException: Collection was modified; enumeration operation ma(代

Unity3D 问题总结Unity报错提示:InvalidOperationException: Collection was modified; enumeration operation ma(代

appium 学习各种小功能总结--功能有《滑动图片保存截图验证元素是否存在》---新手总结(大牛勿喷,新手互相交流)