0

我正在加载图像字节并尝试将其应用到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}
};

统一代码:

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

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

图像是这样显示的...

原来的: 在此处输入图像描述

在应用程序中(对不起大白方块): 在此处输入图像描述

4

2 回答 2

1

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

检查Texture2D.LoadRawTextureData的文档:

传递的数据应根据其宽度、高度、数据格式和 mipmapCount 填充整个纹理所需的大小;否则抛出 UnityException。

解决方案:

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

于 2019-10-24T01:45:33.160 回答
0

在 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();
于 2019-10-28T15:16:42.540 回答