我只用了PC端,其他平台我没试过哈~
一、摄像头进入unity的过程
1.常见的输入内容
常见的输入内容:声音、图片(影像就是一连串图片不停的放,所以摄像头发给电脑的实际上是很多很多图片)
常见的输入设备:输入声音对应的设备一般是麦克风,图片对应的设备一般设摄像头。
2.unity获取设备访问权限
Application(类):这个类里面,都是在应用运行的时候,去获取和控制一些信息的。
RequestUserAuthorization(方法):在上面Application(类)里面,有一个方法,就是可以获取麦克风和摄像头设备的输入信息。
3.摄像机和麦克风
UserAuthorization:摄像头和麦克风,都在UserAuthorization里面。
摄像设备:UserAuthorization.WebCam
麦克风:UserAuthorization.Microphone
4.获取到摄像机的代码部分
因为需要计算机去询问:“你让不让我用呀,能不能给我呀?”
所以,我们不能用普通的方法,我们需要等待它问完。
因此,我们只能用携程。
IEnumerator OpenCamera() {
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
}
5.得知是否可以访问
HasUserAuthorization:获得“你给不给用?”这句话的答案。这个答案也要通过Application
如果可以用,我们就说,相机照到啦,如果不可以用,我们就说,相机找不到!
IEnumerator OpenCamera() {
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
//这小节内容
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
Debug.Log("找到相机");
}
else {
Debug.Log("没找到相机");
}
}
二、获取到摄像头中的图片
1.摄像头中的图片的方法
WebCamTexture(string deviceName, int requestedWidth, int requestedHeight);
这个方法可以获取到摄像头当前的图片,但是它需要一些信息
deviceName:摄像机的名称
requestedWidth:你希望读出来的图片宽是多少?(这里假设我要1920)
requestedHeight:你希望读出来的图片高是多少?(这里假设我要1080)
注意:读取出来的图片是属于WebCamTexture
2.如何获取摄像机的名字
首先应该获取所有插在电脑上的摄像机。
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("没找到相机");
}
}
3.获取图片并赋值
现在我们获取到如下方法所需要的所有资料
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.除了这个相片还想要界面里的边框呀之类
1.只要照片
相机之前是一直在刷新的,所以现在我们让它先停下来;
pics.Stop();
停下来之后,最后一张图是存在 rawImage里面的,我们直接把这张图保存下来就可以了。
这个保存的代码就是在截图拍照的最后几句代码。
2.截图拍照
其实这里也可以分为全屏截图和区域截图,这里只讲区域截图。
区域截图:就是在诺大的界面中,选一块长方形进行截图(其他形状这里也不讨论)。
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);
}
}
五、一些注意事项
1.记得不用了就要关掉相机
如果你没有关闭相机,就是以上代码的pics.Stop(),然后重新加载场景,可能会重新开始调用相机,相机就有可能错乱文章来源:https://www.toymoban.com/news/detail-405535.html
(它会认为上一个场景还在用自己,所以无论什么时候,如果不用了相机了,或者场景需要重新加载了,记得关掉它)文章来源地址https://www.toymoban.com/news/detail-405535.html
六、后面发现什么问题,还是会不定时更新的
到了这里,关于Unity | 如何调用摄像头拍照的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!