我只用了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);
}