Конвертировать массив 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, а затем отправить его по сети. Это уменьшит размер изображения. Смотрите этот ответ для получения дополнительной информации.