Unity调用摄像头拍照及保存图片

可能大家在使用Unity开发项目的时候,会碰到这样一个需求,就是去调用摄像头拍照或者保存图片,其中摄像头拍照方式也有多种,这里就给大家简单介绍下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class CameraTest : MonoBehaviour
{
    //摄像头图像类,继承自texture
    WebCamTexture tex;
    public Image WebCam;
    public MeshRenderer ma;
    public Button saveImage;
    public RawImage bgimage_02;
   // public RawImage bgimage_03;
    int i;
    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();
        }
    }
    private void SaveImage()//在上一段代码中加入该方法
        Save(tex);
        i += 1;public  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();
        //if (i % 2 == 1)
        //{
        //   bgimage_02.texture= t2d;
        //}
        //else
        //{
        //    bgimage_03.texture = t2d;
        //}
          bgimage_02.texture= t2d;
        //存储
        File.WriteAllBytes(Application.streamingAssetsPath + "/my/" + Time.time + ".jpg", imageTytes);void StopCamera()//等待用户允许访问
        //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.Stop();
        }
    }
    //返回按钮
    public void Back()StopCamera();
        UnityEngine.SceneManagement.SceneManager.LoadScene(0);
    }
}

上面已经有调用摄像头并可以保存图片。保存图片有多种方式 :
using UnityEngine;
using System.Collections;
using System.IO;
using UnityEngine.UI;
public class FrameAnimation : MonoBehaviour
{
    public Texture2D image;
    public int w;
    public int h;
    public float nextTime = 0.0f;
    public float rate = 0.3f;
    int i = 0;
    public static string imageName;
    public RawImage raw;
    // Use this for initialization
    void Start()
    {
        w = Screen.width;
        h = Screen.height;
        image = new Texture2D(w, h);// Update is called once per frame
    void Update()//if (Input.GetMouseButton(0) && Time.time > nextTime)
        //{
        //    nextTime = Time.time + rate;
        //    i++;
        //    StartCoroutine(SaveImage(i));
        //}public void Btn_SavrImage()////拍照保存
        //i++;
        //StartCoroutine(SaveImage(i));
        UnityEngine.SceneManagement.SceneManager.LoadScene(2);IEnumerator SaveImage(int i)yield return new WaitForEndOfFrame();
        image.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);//read pixels from screen to texture
        image.Apply();
        byte[] bytes = image.EncodeToPNG();
        string date = System.DateTime.Now.ToString("dd-MM-yy");
        imageName = i + date + ".png";
        File.WriteAllBytes(Application.streamingAssetsPath + "/" +imageName, bytes);
        ReadImage();
        Debug.Log("write a pic"+imageName);
        yield return null;public void ReadImage()string  textureName = Application.streamingAssetsPath + imageName;
        //raw.name = textureName;
        raw.texture = image;
       // UnityEngine.SceneManagement.SceneManager.LoadScene(0);
    }
}
注意:image.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
截图超过1024,768的时候有时候会报错,来自:https://blog.csdn.net/liang_704959721/article/details/80880422
posted @   多见多闻  阅读(1395)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示