| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- using ZIM;
- using ZIM.Unity;
- public class Test : MonoBehaviour
- {
- public RawImage rawImage;
- public RawImage rawImage1;
- public RawImage rawImage2;
- public RawImage rawImage3;
- private WebCamTexture _webCamTexture;
- private Texture2D mUVCTexture2DTemp;
- // Start is called before the first frame update
- void Start()
- {
- CreateTextureIfNeeded(rawImage.texture);
- rawImage1.texture = m_SourceTexture.zimAutoLight(10) ;
- if (m_SourceTexture != null)
- {
- var pixelData = m_TargetTexture.GetPixelData<Color32>(0);
- var pixelDataSource = m_SourceTexture.GetPixelData<Color32>(0);
- //var pixelDataSource = m_SourceTexture.GetPixels();
- var offset = 0;
- for (var y = 0; y < m_SourceTexture.width; ++y)
- {
- for (var x = 0; x < m_SourceTexture.height; ++x, ++offset)
- {
- // Debug.Log(pixelDataSource[offset]);
- pixelData[offset] = pixelDataSource[offset];
- }
- }
- m_TargetTexture.Apply();
- }
- }
- 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;
- }
- string deviceName = devices[0].name;
- _webCamTexture = new WebCamTexture(deviceName, 1280, 720, 30);
- _webCamTexture.Play();
- if (rawImage) rawImage.texture = _webCamTexture;
- Debug.Log("成功开启摄像头 " + deviceName);
- }
- else
- {
- Debug.LogError("开启失败,用户未授予摄像头权限!");
- }
- }
- // Update is called once per frame
- void Update()
- {
-
- if (_webCamTexture && _webCamTexture.didUpdateThisFrame)
- {
- // CreateExternalTextureIfNeeded(rawImage.texture);
- //SaveScreenShot(rawImage.texture);
- if (texture2D != null)
- Destroy(texture2D);
- texture2D = TextureToTexture2D2(rawImage.texture);
- rawImage1.texture = texture2D;
- //var pixels = texture2D.GetPixels();
- //Debug.Log(pixels.Length);
-
- }
- if (Input.GetKeyDown(KeyCode.Space) && texture2D !=null)
- {
- Debug.Log("Input.GetKeyDown(KeyCode.Space)");
- //SaveScreenShot(rawImage.texture);
- if (rawImage3.texture != null)
- DestroyImmediate(rawImage3.texture);
- rawImage3.texture = texture2D.zimAutoLight(10);
- }
- }
- private Texture2D externalTexture;
- public void CreateExternalTextureIfNeeded(Texture texture)
- {
- if (externalTexture != null)
- DestroyImmediate(externalTexture);
- externalTexture = Texture2D.CreateExternalTexture(rawImage.texture.width, rawImage.texture.height, TextureFormat.ARGB32, false, true, rawImage.texture.GetNativeTexturePtr()); //TextureToTexture2D(texture);
- rawImage1.texture = externalTexture;
- }
- private Texture2D texture2D;
- private Texture2D TextureToTexture2D(Texture texture)
- {
- if(texture2D == null) texture2D = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false, true);
- RenderTexture currentRT = RenderTexture.active;
- RenderTexture renderTexture = RenderTexture.GetTemporary(
- texture.width,
- texture.height,
- 0,
- RenderTextureFormat.ARGB32,
- RenderTextureReadWrite.Linear);
- Graphics.Blit(texture, renderTexture);
- RenderTexture.active = renderTexture;
- texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
- texture2D.Apply();
- RenderTexture.active = currentRT;
- RenderTexture.ReleaseTemporary(renderTexture);
- return texture2D;
- }
- private Texture2D TextureToTexture2D2(Texture texture)
- {
- Texture2D _texture2D = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false, true);
- RenderTexture currentRT = RenderTexture.active;
- RenderTexture renderTexture = RenderTexture.GetTemporary(
- texture.width,
- texture.height,
- 0,
- RenderTextureFormat.ARGB32,
- RenderTextureReadWrite.Linear);
- Graphics.Blit(texture, renderTexture);
- RenderTexture.active = renderTexture;
- _texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
- _texture2D.Apply();
- RenderTexture.active = currentRT;
- RenderTexture.ReleaseTemporary(renderTexture);
- return _texture2D;
- }
- Texture2D m_SourceTexture;
- Texture2D m_TargetTexture;
- private void CreateTextureIfNeeded(Texture texture)
- {
- //&& (m_SourceTexture.width != texture.width || m_SourceTexture.height != texture.height)
- //if (m_SourceTexture != null)
- //{
- // DestroyImmediate(m_SourceTexture);
- // m_SourceTexture = null;
- //}
- if(m_SourceTexture == null) m_SourceTexture = new Texture2D(texture.width, texture.height,TextureFormat.ARGB32,false,true);
- RenderTexture renderTexture = RenderTexture.GetTemporary(
- texture.width,
- texture.height,
- 0,
- RenderTextureFormat.ARGB32,
- RenderTextureReadWrite.Linear);
- Graphics.Blit(texture, renderTexture);
- RenderTexture currentRT = RenderTexture.active;
- RenderTexture.active = renderTexture;
- m_SourceTexture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
- m_SourceTexture.Apply();
- RenderTexture.active = currentRT;
- RenderTexture.ReleaseTemporary(renderTexture);
- if (m_TargetTexture != null)
- {
- DestroyImmediate(m_TargetTexture);
- m_TargetTexture = null;
- }
- if (m_TargetTexture == null)
- {
- m_TargetTexture = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false, true);
- m_TargetTexture.wrapMode = TextureWrapMode.Clamp;
- rawImage2.texture = m_TargetTexture;
- }
- }
- private static Texture2D ResizeTexture(Texture source)
- {
- if (source != null)
- {
- int width = source.width;
- int height = source.height;
- // 创建临时的RenderTexture
- RenderTexture renderTex = RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
- // 复制source的纹理到RenderTexture里
- Graphics.Blit(source, renderTex);
- // 开启当前RenderTexture激活状态
- RenderTexture previous = RenderTexture.active;
- RenderTexture.active = renderTex;
- // 创建修改后的纹理,保持与源纹理相同压缩格式
- Texture2D resizedTexture = new Texture2D(width, height, TextureFormat.ARGB32, false,true);
- // 读取像素到创建的纹理中
- resizedTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
- // 应用修改到GPU上
- resizedTexture.Apply();
- // 停止当前RenderTexture工作
- RenderTexture.active = previous;
- // 释放内存
- RenderTexture.ReleaseTemporary(renderTex);
- return resizedTexture;
- }
- else
- {
- return null;
- }
- }
- private Texture2D CreateTextureBySetGetPixels(Texture2D sourceTexture)
- {
- if (sourceTexture != null)
- {
- int sourceMipLevel = 0;
- Color[] srcPixels = sourceTexture.GetPixels(sourceMipLevel);
- //newTextureByPixels = new Texture2D(sourceTexture.width, sourceTexture.height);
- Texture2D newTextureByPixels = new Texture2D(sourceTexture.width, sourceTexture.height, sourceTexture.format, false);
- newTextureByPixels.SetPixels(srcPixels);
- newTextureByPixels.Apply();
- return newTextureByPixels;
- }
- else
- {
- Debug.LogWarning("Texture is null");
- return null;
- }
- }
- private Texture2D CreateTextureByRawData(Texture2D sourceTexture)
- {
- if (sourceTexture != null)
- {
- Texture2D newTextureByRawData = new Texture2D(sourceTexture.width, sourceTexture.height, sourceTexture.format, false);
- // 对于运行时纹理生成,也可以通过GetRawTextureData直接写入纹理数据,返回一个Unity.Collections.NativeArray
- // 这可以更快,因为它避免了 LoadRawTextureData 会执行的内存复制。
- newTextureByRawData.LoadRawTextureData(sourceTexture.GetRawTextureData());
- newTextureByRawData.Apply();
- return newTextureByRawData;
- }
- else
- {
- Debug.LogWarning("Texture is null");
- return null;
- }
- }
- }
|