寫在前面:
最近項目中需要用到拍照的功能,這個功能說難其實不難,說簡單但是用的人很少。我在網上找了一些資料,加上自己的理解整理一些新的。
如何調用攝像頭?
調用攝像頭這個是一個比較簡單的事,因為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