Конвертировать массив Color32 в байтовый массив для отправки по сети

Я работал над потоковой веб-камерой для захвата видео и фото на устройствах Android в Unity3D. В большинстве примеров, которые я нашел для захвата каналов веб-камеры, используется определенный объект WebCamTexture, чтобы получить доступ к аппаратному обеспечению камеры устройства. В настоящее время я могу захватить вход камеры, но WebCamTexture хранит данные как Color32[]. Я нашел это решение ниже для преобразования Color32 [] в байт [], но похоже, что он поменял местами красный и синий цветовые каналы.

/questions/22326509/byistroe-kopirovanie-massiva-color32-v-massiv-byte/22326519#22326519

Есть ли способ предотвратить смещение красного и синего каналов?

1 ответ

Вот еще один способ конвертировать 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 который является байтовым массивом.

Загрузите в Texture 2D, если необходимо:

Texture2D tex = new Texture2D(2, 2);
tex.LoadRawTextureData(colorArray.byteArray);
tex.Apply();

Как я уже сказал в своем комментарии, лучше конвертировать WebCamTexture в Texture2D затем в JPEG или PNG, а затем отправить его по сети. Это уменьшит размер изображения. Смотрите этот ответ для получения дополнительной информации.

Другие вопросы по тегам