http://bbs.9ria.com/thread-170539-1-1.html
项目要求调用摄像头,并且把图像保存下来,上传到服务器。
这里有几个难点,调用摄像头是很简单的,unity已经提供好了接口,我们只需要调用就行。问题就是怎么把图片保存下来。我们来看下代码。
public string deviceName; WebCamTexture tex;//接收返回的图片数据 /// <summary> /// 实现IEnumerator接口,这里使用了一个协程,相当于多线程。 /// 这里是调用摄像头的方法。 /// </summary> /// <returns></returns> IEnumerator test() { yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//授权 if (Application.HasUserAuthorization(UserAuthorization.WebCam)) { WebCamDevice[] devices = WebCamTexture.devices; deviceName = devices[0].name; //设置摄像机摄像的区域 tex = new WebCamTexture(deviceName, 400, 300, 12); tex.Play();//开始摄像 } }
下面看这段怎么使用上面的那段代码。
void OnGUI() { //开始按钮 if (GUI.Button(new Rect(0, 0, 100, 100), "click")) { //调用启动那个协程,开启摄像头 StartCoroutine(test()); } //暂停 if(GUI.Button(new Rect(0,200,100,30),"pause")) { tex.Pause(); //这个方法就是保存图片 StartCoroutine(getTexture2d()); } //重启开始 if (GUI.Button(new Rect(0, 300, 100, 30), "restart")) { tex.Play(); } if (GUI.Button(new Rect(100, 0, 100, 30), "摄像")) { //开始摄像,摄像就是一系列的图片集合 StartCoroutine(getTexture2dshexiang()); } if(tex!=null) GUI.DrawTexture(new Rect(200, 200, 200, 180), tex); }
保存图片是一个难点,找了半天,才发现这个方法来实现
/// <summary> /// 获取摄像头截取的图片,这里也是一个协程 /// </summary> /// <returns></returns> IEnumerator getTexture2d() { yield return new WaitForEndOfFrame(); Texture2D t = new Texture2D(200, 180);//要保存图片的大小 //截取的区域 t.ReadPixels(new Rect(200, 320, 200, 180), 0, 0, false); t.Apply(); //把图片数据转换为byte数组 byte[] byt = t.EncodeToPNG(); //然后保存为图片 File.WriteAllBytes(Application.dataPath + "/shexiang/" + Time.time + ".jpg", byt); }
保存文件的路径需要自己来设置,要保存的区域大家自己可以来调。