В загружаемых изображениях Unity UWP отсутствуют цветные каналы - PullRequest
0 голосов
/ 23 октября 2019

Я загружаю байты изображения и пытаюсь применить его в Texture2D.

Не беспокойтесь о проблемах асинхронности / ожидания / потока ...

Код UWP:

StorageFile storageFile = StorageFile.GetFileFromPathAsync(filePath).AsTask().GetAwaiter().GetResult();

// get image size
IRandomAccessStreamWithContentType random = storageFile.OpenReadAsync().AsTask().GetAwaiter().GetResult();
BitmapDecoder decoder = BitmapDecoder.CreateAsync(random).AsTask().GetAwaiter().GetResult();
BitmapFrame bitmapFrame = decoder.GetFrameAsync(0).AsTask().GetAwaiter().GetResult();
PixelDataProvider pixelData = bitmapFrame.GetPixelDataAsync().AsTask().GetAwaiter().GetResult();

return new Dictionary<string, object>
{
    {"bytes", pixelData.DetachPixelData()},
    {"width", (int) decoder.PixelWidth},
    {"height", (int) decoder.PixelHeight}
};

Код Unity:

Texture2D texture = new Texture2D(textureSizeStruct.width, textureSizeStruct.height, TextureFormat.RGBA32, false);

texture.LoadRawTextureData(textureBytes);
texture.Apply();

Вот как отображаются изображения ...

Оригинал: enter image description here

В приложении (простите за большой белый квадрат): enter image description here

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Ваши каналы изображений не пропущены, они просто в другом порядке .

Проверьте документы Texture2D.LoadRawTextureData :

Переданные данные должны иметь требуемый размер для заполнения всей текстуры в соответствии с ее шириной, высотой, формат данных и mipmapCount;в противном случае генерируется исключение UnityException.

Решение:

Передайте TextureFormat.BGRA32 вместо вашего Texture2D конструктора.

0 голосов
/ 28 октября 2019

На стороне UWP необходимо получить пиксели от декодера с нужными параметрами. Следуйте ниже решения:

StorageFile storageFile = StorageFile.GetFileFromPathAsync(filePath).AsTask().GetAwaiter().GetResult();
IRandomAccessStreamWithContentType random = storageFile.OpenReadAsync().AsTask().GetAwaiter().GetResult();
BitmapDecoder decoder = BitmapDecoder.CreateAsync(random).AsTask().GetAwaiter().GetResult();

// here is the catch
PixelDataProvider pixelData = decoder.GetPixelDataAsync(
    BitmapPixelFormat.Rgba8, // <--- you must to get the pixels like this
    BitmapAlphaMode.Straight,
    new BitmapTransform(),
    ExifOrientationMode.RespectExifOrientation,
    ColorManagementMode.DoNotColorManage // <--- you must to set this too
).AsTask().GetAwaiter().GetResult();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...