我一直致力于在Unity3D中的Android设备上进行视频和照片捕获的网络摄像头流媒体。我发现的大多数捕获网络摄像头源的示例都使用特定的WebCamTexture对象来访问设备摄像头硬件。我目前能够捕获相机输入,但WebCamTexture将数据存储为Color32 []。我在下面找到了这个解决方案,用于将Color32 []转换为byte [],但它似乎正在交换红色和蓝色通道。
https://stackoverflow.com/a/21575147/8115962
有没有办法阻止红色和蓝色通道反转?
答案 0 :(得分:2)
以下是将Color32
数组从WebCamTexture
转换为字节数组的另一种方法:
首先,创建一个结构来保存转换后的数组:
[StructLayout(LayoutKind.Explicit)]
public struct Color32Array
{
[FieldOffset(0)]
public byte[] byteArray;
[FieldOffset(0)]
public Color32[] colors;
}
要转换的WebCamTexture
:
WebCamTexture webcamTex = new WebCamTexture();
创建该结构的新实例:
Color32Array colorArray = new Color32Array();
使用适当的大小初始化Color32:
colorArray.colors = new Color32[webcamTex.width * webcamTex.height];
填写Color32
自动填充字节数组:
webcamTex.GetPixels32(colorArray.colors);
现在,您可以使用colorArray.byteArray
字节数组。
如果需要,加载到纹理2D:
Texture2D tex = new Texture2D(2, 2);
tex.LoadRawTextureData(colorArray.byteArray);
tex.Apply();
就像我在comment中说的那样,最好将WebCamTexture
转换为Texture2D
然后转换为 jpeg 或 png 通过网络发送。这将减少图像的大小。有关详细信息,请参阅this答案。