Unity调用摄像头拍照及保存图片
发表于2018-10-17
可能大家在使用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); } }
把它挂到一个有renderer的物体上,
上面已经有调用摄像头并可以保存图片。
保存图片有多种方式 :
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