Преобразование массива Color32 в массив байтов для отправки по сети

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

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

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


person Nate Farrell    schedule 30.11.2017    source источник
comment
Отправка текстур по сети очень тяжелая и тратит впустую пропускную способность. Почему бы не преобразовать его в jpg или png перед отправкой? См. этот пост....   -  person Programmer    schedule 30.11.2017


Ответы (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, а затем отправьте его по сети. Это уменьшит размер изображения. Дополнительную информацию см. в этом ответе.

person Programmer    schedule 30.11.2017