Windows应用商店 - 像素阵列

时间:2014-07-30 20:16:49

标签: c# bitmap windows-runtime windows-store-apps winrt-xaml

我正在一个应用程序中工作,我需要从图像中获取像素数组,并使用像素数组编辑图像。

我正在使用下一个代码从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;
        }
    }
 }

现在,我的问题是:

  
      
  1. 为什么我加载一个6000 x 4000像素的图像我的数组只有8,941,799,这实际上是我在磁盘上的图像大小?
  2.   
  3. 如何访问像素的RGBA通道?
  4.   

1 个答案:

答案 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();

您可以查看扩展程序herehere,了解如何处理像素。