Unity UWP 加载图像字节缺少颜色通道

Unity UWP load image bytes is missing color channels

我正在加载图像字节并尝试将其应用到 Texture2D

不用担心async/await/thread问题...

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}
};

统一码:

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

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

图片是这样显示的...

原文:

在应用程序中(对不起,白色的大方块):

您的图像通道没有丢失,它们只是不同的顺序

查看 Texture2D.LoadRawTextureData 的文档:

Passed data should be of required size to fill the whole texture according to its width, height, data format and mipmapCount; otherwise a UnityException is thrown.

解法:

TextureFormat.BGRA32 传递给您的 Texture2D 构造函数。

在 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();