首页 > 代码库 > Unity 3D 调用摄像头捕获照片 录像

Unity 3D 调用摄像头捕获照片 录像

1,要想调用摄像头首先要打开摄像头驱动,如果用户允许则可以使用。

2,定义WebCamTexture的变量用于捕获单张照片。

3,连续捕获须启用线程。

实现代码:

  

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime .Serialization.Formatters.Binary;
using System.Threading;



public class takePhoto : MonoBehaviour 
{
    public string deviceName;
    //接收返回的图片数据
    WebCamTexture tex;

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 20, 100, 40), "开启摄像头"))
        {
            // 调用摄像头
            StartCoroutine(start());
        }

        if(GUI.Button(new Rect(10,70,100,40),"捕获照片"))
        {
            //捕获照片
            tex.Pause();
            StartCoroutine(getTexture());
        }

        if(GUI.Button(new Rect(10,120,100,40),"再次捕获"))
        {
            //重新开始
            tex.Play();
        }

        if(GUI.Button(new Rect(120,20,80,40),"录像"))
        {
            //录像
            StartCoroutine(SeriousPhotoes());
        }

        if(GUI.Button(new Rect(10,170,100,40),"停止"))
        {
            //停止捕获镜头
            tex.Stop ();
            StopAllCoroutines();
        }

        if(tex!=null)
        {
            // 捕获截图大小               —距X左屏距离   |   距Y上屏距离  
            GUI.DrawTexture(new Rect(Screen.width/2-150,Screen.height/2-190,280,200),tex); 
        }

    }

    /// <summary>
    /// 捕获窗口位置
    /// </summary>
    public IEnumerator start()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName= devices[0].name;
            tex=new WebCamTexture(deviceName,300,300,12);
            tex.Play();
        }
    }

    /// <summary>
    /// 获取截图
    /// </summary>
    /// <returns>The texture.</returns>
    public IEnumerator getTexture()
    {
        yield return new WaitForEndOfFrame();
        Texture2D t=new Texture2D(400,300);
        t.ReadPixels( new Rect(Screen.width/2-200,Screen.height/2-50,360,300),0,0,false);
                                         //距X左的距离        距Y屏上的距离
       // t.ReadPixels(new Rect(220, 180, 200, 180), 0, 0, false);
        t.Apply();
        byte[] byt=t.EncodeToPNG();
        File.WriteAllBytes(Application.dataPath+"/Photoes/"+Time.time+".jpg",byt);
        tex.Play();
    }

    /// <summary>
    /// 连续捕获照片
    /// </summary>
    /// <returns>The photoes.</returns>
    public IEnumerator SeriousPhotoes()
    {
        while (true)
        {
            yield return new WaitForEndOfFrame();
            Texture2D t = new Texture2D(400, 300, TextureFormat.RGB24, true);
            t.ReadPixels(new Rect(Screen.width/2-180,Screen.height/2-50,360,300), 0, 0, false);
            t.Apply();
            print(t);
            byte[] byt = t.EncodeToPNG();
            File.WriteAllBytes(Application.dataPath + "/MulPhotoes/" + Time.time.ToString().Split(.)[0] + "_" + Time.time.ToString().Split(.)[1] + ".png", byt);
            Thread.Sleep(300);
        }
    }
}

将此脚本绑定到MainCamer上,运行效果如下:

其余也没什么了,哦,对了,记得建个空文件夹用于储存捕获到的照片。

希望我们能够共同学习!