我正在一个应用程序中工作,我需要从图像中获取像素数组,并使用像素数组编辑图像。
我正在使用下一个代码从StorageFile对象获取像素数组,表示图像:
public static async Task<byte[]> GetPixelsArrayFromStorageFileAsync(
IRandomAccessStreamReference file)
{
using (IRandomAccessStream stream = await file.OpenReadAsync())
{
using (var reader = new DataReader(stream.GetInputStreamAt(0)))
{
await reader.LoadAsync((uint)stream.Size);
var pixelByte = new byte[stream.Size];
reader.ReadBytes(pixelByte);
return pixelByte;
}
}
}
现在,我的问题是:
- 为什么我加载一个6000 x 4000像素的图像我的数组只有8,941,799,这实际上是我在磁盘上的图像大小?
- 如何访问像素的RGBA通道?
醇>
答案 0 :(得分:1)
您的文件具有位图的压缩版本,因此您需要先对其进行解码。我建议将其加载到WriteableBitmap
中,因为无论如何都需要显示它,然后访问位图的PixelBuffer
属性以获取实际像素。你可以这样做:
var writeableBitmap = new WriteableBitmap(1, 1);
await writeableBitmap.SetSourceAsync(yourFileStream);
var pixelStream = writeableBitmap.PixelBuffer.AsStream();
var bytes = new byte[pixelStream.Length];
pixelStream.Seek(0, SeekOrigin.Begin);
pixelStream.Read(bytes, 0, Bytes.Length);
// Update the bytes here. I think they follow the BGRA pixel format.
pixelStream.Seek(0, SeekOrigin.Begin);
pixelStream.Write(bytes, 0, bytes.Length);
writeableBitmap.Invalidate();