• Unity 3D之调用摄像头并存储


    写在前面:

    最近项目中需要用到拍照的功能,这个功能说难其实不难,说简单但是用的人很少。我在网上找了一些资料,加上自己的理解整理一些新的。

    如何调用摄像头?

    调用摄像头这个是一个比较简单的事,因为Unity已经封装了一些好的接口,我们直接可以调用就好了:

    public class CameraTest : MonoBehaviour {
    //摄像头图像类,继承自texture
        WebCamTexture tex;
        public Image WebCam;
        public MeshRenderer ma;
        public Button saveImage;
    
        void Start () {
    //开启协程,获取摄像头图像数据
            StartCoroutine(OpenCamera());
            saveImage.onClick.AddListener(SaveImage);
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
        IEnumerator OpenCamera()
        {
    //等待用户允许访问
            yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
    //如果用户允许访问,开始获取图像        
    if (Application.HasUserAuthorization(UserAuthorization.WebCam))
            {
    //先获取设备
                WebCamDevice[] device = WebCamTexture.devices;
                
                string deviceName = device[0].name;
    //然后获取图像
                tex = new WebCamTexture(deviceName);
    //将获取的图像赋值
                ma.material.mainTexture = tex;
    //开始实施获取
                tex.Play();
                
            }
        }
    }

    将这段代码赋值给一个带render的物体就能够显示摄像机拍摄的效果。

    图片保存

    图片保存这里就有点难度了,我们要获取到摄像机的图像那么主要分为两个方法:

    1、截屏。也是大多数人采用的方法。

    2、将摄像机的图像数据保存。本文所用的方法。

    截屏方法很多,大家可以去网上找找,我这里引用一个:http://blog.csdn.net/qq_28221881/article/details/53820918。、

    截屏这里有一个需要注意的地方,那就是保存获取函数必须在协程中等待这一帧结束。

    直接保存摄像机图片

    但我们通常直接使用截图的话会非常不方便,

    首先是我们需要去结算图片的位置,如果位置不对那截出来的就会很尴尬。除非是全屏。

    其次截图受到灯光等3D场景的影响。

    然后是截图的大小不一定是满意的。

    所以我们就想到直接使用webcamTexture这个类保存摄像机的图像。

        private void SaveImage()
        {
    //在上一段代码中加入该方法
            CameraTextureSave.Save(tex);
    
        }
    public class CameraTextureSave : MonoBehaviour {
    
    public static void Save(WebCamTexture t)
        {
            Texture2D t2d = new Texture2D(t.width,t.height,TextureFormat.ARGB32,true);
           //将WebCamTexture 的像素保存到texture2D中
            t2d.SetPixels(t.GetPixels());
            //t2d.ReadPixels(new Rect(200,200,200,200),0,0,false);
            t2d.Apply();
    //编码
            byte[] imageTytes = t2d.EncodeToJPG();
    
            //存储
            File.WriteAllBytes(Application.streamingAssetsPath + "/my/" + Time.time + ".jpg", imageTytes);
        }
    }

    出于强迫症的原因,我将保存方法单独写在另一个类中方便调用。

    这里文件写入使用很简单的写入方法,需要注意的是需要手动创建目录,不然会报错。

    两种方法截图效果对比:

                                  本文方法 

                 截图方法

     thissky出品,转载请注明出处:http://www.cnblogs.com/zhuhongjongy/p/7199308.html

  • 相关阅读:
    爬取卡通图片
    python 列表生成式
    python 装饰器
    python 协程 and 进程
    ssh登录缓慢问题
    解决 input 元素点击有蓝色边框的问题
    JavaScript面试题总结系列(九)
    JavaScript面试题总结系列(八)
    JavaScript面试题总结系列(七)
    JavaScript面试题总结系列(六)
  • 原文地址:https://www.cnblogs.com/zhuhongjongy/p/7199308.html
Copyright © 2020-2023  润新知