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

 

转载于:https://www.cnblogs.com/zhuhongjongy/p/7199308.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值