using System.Collections; using UnityEngine; using UnityEngine.UI; // using AndroidJavaClass = UnityEngine.AndroidJNI.AndroidJavaClass; // using AndroidJavaObject = UnityEngine.AndroidJNI.AndroidJavaObject; public class ZIMWebCamera : MonoBehaviour { public int cameraIndex = 1; public int width = 1280; public int height = 720; public int fps = 60; public RawImage rawImage; public RawImage rawImageSize; public MaintainAspectRatio maintainAspectRatio; private WebCamTexture _webCamTexture; public WebCamTexture webCamTexture { get => _webCamTexture; } public Vector2 Size => new Vector2(width, height); public Text logText; public Transform mParent; private IEnumerator Start() { yield return new WaitForEndOfFrame(); OnClick_Open(); } private void Awake() { } private void Update() { if (_webCamTexture && _webCamTexture.didUpdateThisFrame) { width = _webCamTexture.width; height = _webCamTexture.height; fps = (int)_webCamTexture.requestedFPS; rawImageSize.texture = rawImage.texture; //rawImageSize.SetNativeSize(); maintainAspectRatio.AdjustSize(); AdjustTexture(); ScreenLocate.Main.setUVCTexture = adjustedTexture; rawImage.texture = ScreenLocate.Main.getUVCTexture; } } public Vector2Int IndexToCoord(int i) { var y = i / width; var x = i % width; return new Vector2Int(x, y); } public int CoordToIndex(int x, int y) { return y * width + x; } public void AdjustResolution(int width, int height) { _webCamTexture.Stop(); _webCamTexture = new WebCamTexture(_webCamTexture.deviceName, width, height); _webCamTexture.Play(); Debug.Log("[ZIMWebCamera] 分辨率调整: " + _webCamTexture.width + "×" + _webCamTexture.height); } public void OnClick_Open() { if (_webCamTexture != null) { Debug.LogError("开启失败,请先关闭正在使用的摄像头!"); return; } if (Application.HasUserAuthorization(UserAuthorization.WebCam)) { WebCamDevice[] devices = WebCamTexture.devices; for (int i = 0; i < devices.Length; i++) { Debug.Log("devices[" + i + "].name:" + devices[i].name); this.logText.text += "devices[" + i + "].name:" + devices[i].name + "\n"; } if (devices.Length == 0) { Debug.LogError("开启失败,没找到可用的摄像头!"); return; } if (devices.Length < cameraIndex + 1) { Debug.Log("开启失败,没有对应序号的摄像头! 尝试启动默认摄像头"); cameraIndex = 0; //return; } string deviceName = devices[cameraIndex].name; _webCamTexture = new WebCamTexture(deviceName, width, height, fps); //try { _webCamTexture.Play(); // if (rawImage) rawImage.texture = _webCamTexture; Debug.Log("ZIMWebCamera fps:" + fps + ",size:[" + width + "," + height + "]"); ScreenLocate.Main.WebCamIsReady(_webCamTexture); // rawImage.texture = ScreenLocate.Main.getUVCTexture; Debug.Log("ZIMWebCamera成功开启摄像头name:" + deviceName + ",size:[" + _webCamTexture.width + "," + _webCamTexture.height + "]"); } //catch (System.Exception e) //{ // Debug.Log("摄像头开启失败 " + deviceName + ", 可能有其他软件占用, " + e.Message); //} //o0WebCam = new o0.Project.WebCam(_webCamTexture); /* Task.Run(() => { if(_webCamTexture.didUpdateThisFrame) });/**/ } else { Debug.LogError("开启失败,用户未授予摄像头权限!"); } } public void newWebCamTexture(string name) { _webCamTexture = new WebCamTexture(name, width, height, fps); _webCamTexture.Play(); if (rawImage) rawImage.texture = _webCamTexture; } public void OnClick_Close() { if (_webCamTexture != null) { _webCamTexture.Stop(); _webCamTexture = null; if (rawImage) rawImage.texture = null; Debug.Log("成功关闭摄像头"); //o0WebCam.Dispose(); //o0WebCam = null; } } public void OnClick_ScreenLocateManual() { GameObject o = ViewManager2.ShowTestInfraredScreenPositioningView(mParent); InfraredScreenPositioningView _infraredScreenPositioningView = o.GetComponent();//FindObjectOfType(); _infraredScreenPositioningView.enterFromZimWebCamera = true; ScreenLocate.Main.ResetScreenIdentification(); } void AdjustBrightnessContrast(Color32[] pixels, float brightness, float contrast) { float contrastFactor = 1.0f + contrast; for (int i = 0; i < pixels.Length; i++) { Color32 pixel = pixels[i]; float r = pixel.r / 255.0f; float g = pixel.g / 255.0f; float b = pixel.b / 255.0f; r = Mathf.Clamp01(((r - 0.5f) * contrastFactor + 0.5f) + brightness); g = Mathf.Clamp01(((g - 0.5f) * contrastFactor + 0.5f) + brightness); b = Mathf.Clamp01(((b - 0.5f) * contrastFactor + 0.5f) + brightness); pixel.r = (byte)(r * 255); pixel.g = (byte)(g * 255); pixel.b = (byte)(b * 255); pixels[i] = pixel; } } private Texture2D adjustedTexture; private void AdjustTexture() { Color32[] pixels = _webCamTexture.GetPixels32(); if (!ScreenLocate.Main.DebugOnZIMDemo) AdjustBrightnessContrast(pixels, ScreenLocate.Main.pcBrightness, ScreenLocate.Main.pcContrast); if (adjustedTexture == null || adjustedTexture.width != _webCamTexture.width || adjustedTexture.height != _webCamTexture.height) { adjustedTexture = new Texture2D(_webCamTexture.width, _webCamTexture.height); } adjustedTexture.SetPixels32(pixels); adjustedTexture.Apply(); } }