赞
踩
我只用了PC端,其他平台我没试过哈~
常见的输入内容:声音、图片(影像就是一连串图片不停的放,所以摄像头发给电脑的实际上是很多很多图片)
常见的输入设备:输入声音对应的设备一般是麦克风,图片对应的设备一般设摄像头。
Application(类):这个类里面,都是在应用运行的时候,去获取和控制一些信息的。
RequestUserAuthorization(方法):在上面Application(类)里面,有一个方法,就是可以获取麦克风和摄像头设备的输入信息。
UserAuthorization:摄像头和麦克风,都在UserAuthorization里面。
摄像设备:UserAuthorization.WebCam
麦克风:UserAuthorization.Microphone
因为需要计算机去询问:“你让不让我用呀,能不能给我呀?”
所以,我们不能用普通的方法,我们需要等待它问完。
因此,我们只能用携程。
- IEnumerator OpenCamera() {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
- }
HasUserAuthorization:获得“你给不给用?”这句话的答案。这个答案也要通过Application
如果可以用,我们就说,相机照到啦,如果不可以用,我们就说,相机找不到!
- IEnumerator OpenCamera() {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
-
- //这小节内容
- if (Application.HasUserAuthorization(UserAuthorization.WebCam))
- {
- Debug.Log("找到相机");
- }
- else {
- Debug.Log("没找到相机");
- }
- }
WebCamTexture(string deviceName, int requestedWidth, int requestedHeight);
这个方法可以获取到摄像头当前的图片,但是它需要一些信息
deviceName:摄像机的名称
requestedWidth:你希望读出来的图片宽是多少?(这里假设我要1920)
requestedHeight:你希望读出来的图片高是多少?(这里假设我要1080)
注意:读取出来的图片是属于WebCamTexture
首先应该获取所有插在电脑上的摄像机。
WebCamDevice:摄像机属于的类
WebCamTexture.devices:获取所有插在电脑上的摄像机的方法
- IEnumerator OpenCamera() {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
-
- if (Application.HasUserAuthorization(UserAuthorization.WebCam))
- {
- Debug.Log("找到相机");
-
- //本节内容
- //获取所有摄像机
- WebCamDevice[] devices = WebCamTexture.devices;
- //我们可能插很多摄像机,所以我们用了一个数组来接收WebCamDevice[] devices
- }
- else {
- Debug.Log("没找到相机");
- }
- }
我们就用找到的第一台摄像机就行了,所以我们只需要第一台的名字
- //本节内容
- string CameraName;
-
- IEnumerator OpenCamera() {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
-
- if (Application.HasUserAuthorization(UserAuthorization.WebCam))
- {
- Debug.Log("找到相机");
-
- //获取所有摄像机
- WebCamDevice[] devices = WebCamTexture.devices;
- //本节内容
- CameraName = devices[0].name;
- }
- else {
- Debug.Log("没找到相机");
- }
- }
现在我们获取到如下方法所需要的所有资料
WebCamTexture(string deviceName, int requestedWidth, int requestedHeight);
WebCamTexture pics = new WebCamTexture(CameraName, 1920, 1080);
注:这里的WebCamTexture可以和Texture通用
所以,我在外面和代码各建了一个RawImage用来传递获取到的图片
把图一拖给图二。
- string CameraName;
-
- //小节内容
- [SerializeField] RawImage rawImage;
- WebCamTexture pics;
-
- private void Start()
- {
- StartCoroutine(OpenCamera());
- }
-
- IEnumerator OpenCamera() {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
-
- if (Application.HasUserAuthorization(UserAuthorization.WebCam))
- {
- Debug.Log("找到相机");
-
- //获取所有摄像机
- WebCamDevice[] devices = WebCamTexture.devices;
- CameraName = devices[0].name;
-
- pics = new WebCamTexture(CameraName,1920, 1080);
-
- //小节内容
- rawImage.texture = pics;
- //启用摄像机
- pics.Play();
- }
- else {
- Debug.Log("没找到相机");
- }
- }
这样就可以获取摄像头了。
上面如果获取到的图像非常卡,可以把
WebCamTexture pics = new WebCamTexture(CameraName,1920, 1080);
里面1920和1080降低一点,
如果实在不知道放多少,可以放0,0,他会自己默认给个数。
拍照有两种:
1.你只要这个相片
2.除了这个相片还想要界面里的边框呀之类
相机之前是一直在刷新的,所以现在我们让它先停下来;
pics.Stop();
停下来之后,最后一张图是存在 rawImage里面的,我们直接把这张图保存下来就可以了。
这个保存的代码就是在截图拍照的最后几句代码。
其实这里也可以分为全屏截图和区域截图,这里只讲区域截图。
区域截图:就是在诺大的界面中,选一块长方形进行截图(其他形状这里也不讨论)。
a.Rect
在unity中,长方体就是Rect,所以我们建一个Rect。
[SerializeField] Rect rect;
如果你挂到了物体上,你就可以看见下图:
这个图也很好理解,你要一个长方形,必须要给他W(宽),H(高),和它的位置(x,y)。
但是这里要了解一个事情:
Rect的坐标是左下角是(0,0)。
现在我们要去填这四个数。那么我们要确定一下,我们要截图哪部分,拿Image在图里面比一下。
假设我需要绿色的这部分。
注意,这个Image要放在Canvas下面,否则坐标还要去调。
因为刚才说的,Rect的零点在左下角,所以我们要把这个Image的零点改到左下角。
这会上面的数据就可以用了:
这里给他取个整吧。
到这里,我们的方框的位置,和大小,就是这个Image的位置和大小了。
可以把Image删掉了。
b.根据方块块的位置截图
- IEnumerator TakePic0() {
- pics.Stop();
- yield return new WaitForEndOfFrame();
- //先建一个和想截图一样大小的Texture2D
- Texture2D texture = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, true);
- //让这个texture读取一下现在方块块那块位置的图
- texture.ReadPixels(rect, 0, 0);
- //让这个texture应用一下刚才方块块的图,就是和我们做完文件点保存是一个意思
- texture.Apply();
- //把图片转成PNG格式
- byte[] bytes = texture.EncodeToPNG();
- //写一下你打算保存到哪
- string s = Application.streamingAssetsPath+"/0.png";
- //最后把转换好的格式,保存在你想保存的地址里
- System.IO.File.WriteAllBytes(s, bytes);
- }
有粉丝问能不能放全部代码~宠粉up立马安排~
为了能把功能串起来,加了一个按钮,点击按钮的时候截图保存图片
记得把按钮拖进来哦~(Rect的数据不要抄哈,这个根据你自己去情况设置的,详情见上面讲过)
上代码~
- using System.Collections;
- using UnityEngine;
- using UnityEngine.UI;
-
- public class ControlCamera : MonoBehaviour
- {
- string CameraName;
-
- [SerializeField] RawImage rawImage;
- WebCamTexture pics;
- [SerializeField] Rect rect;
-
- //点击按钮保存图片
- public Button btnDown;
-
- private void Start()
- {
- btnDown.onClick.AddListener(TakePic);
- StartCoroutine(OpenCamera());
- }
-
- IEnumerator OpenCamera()
- {
- yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
-
- if (Application.HasUserAuthorization(UserAuthorization.WebCam))
- {
- Debug.Log("找到相机");
-
- //获取所有摄像机
- WebCamDevice[] devices = WebCamTexture.devices;
- CameraName = devices[0].name;
-
- pics = new WebCamTexture(CameraName, 0, 0);
-
- //小节内容
- rawImage.texture = pics;
- //启用摄像机
- pics.Play();
- }
- else
- {
- Debug.Log("没找到相机");
- }
- }
-
- public void TakePic() {
- StartCoroutine(TakePic0());
- }
-
- IEnumerator TakePic0()
- {
- pics.Stop();
- yield return new WaitForEndOfFrame();
- //先建一个和想截图一样大小的Texture2D
- Texture2D texture = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, true);
- //让这个texture读取一下现在方块块那块位置的图
- texture.ReadPixels(rect, 0, 0);
- //让这个texture应用一下刚才方块块的图,就是和我们做完文件点保存是一个意思
- texture.Apply();
- //把图片转成PNG格式
- byte[] bytes = texture.EncodeToPNG();
- //写一下你打算保存到哪
- string s = Application.streamingAssetsPath + "/0.png";
- //最后把转换好的格式,保存在你想保存的地址里
- System.IO.File.WriteAllBytes(s, bytes);
- }
-
- }
如果你没有关闭相机,就是以上代码的pics.Stop(),然后重新加载场景,可能会重新开始调用相机,相机就有可能错乱
(它会认为上一个场景还在用自己,所以无论什么时候,如果不用了相机了,或者场景需要重新加载了,记得关掉它)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。