将Color32数组转换为字节数组以通过网络

时间:2017-11-30 14:08:54

标签: c# unity3d image-capture color-channel

我一直致力于在Unity3D中的Android设备上进行视频和照片捕获的网络摄像头流媒体。我发现的大多数捕获网络摄像头源的示例都使用特定的WebCamTexture对象来访问设备摄像头硬件。我目前能够捕获相机输入,但WebCamTexture将数据存储为Color32 []。我在下面找到了这个解决方案,用于将Color32 []转换为byte [],但它似乎正在交换红色和蓝色通道。

https://stackoverflow.com/a/21575147/8115962

有没有办法阻止红色和蓝色通道反转?

1 个答案:

答案 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答案。