1

我正在尝试学习如何与图像的一些 WinRT (Metro) 对象进行交互。基本上,我正在努力创建易于使用的“GetPixel”和“SetPixel”方法(类似于不能在 Metro 应用程序中使用的 System.Drawing.Bitmap 中的内容)。

为了测试,我创建了一个“位图”类。它基于我从 Metro 文件选择器控件获得的 IRandomAccessStream 加载。我能够将像素数据加载到 Byte 数组中,然后从中创建一个 BitmapImage,当我将它扔到 Image 控件中时,它可以在 XAML 表单上正确呈现。

这是我的问题,我可以查看字节数组并查看各个 ARGB 值,但是它的像素远远少于应有的像素。例如,我正在加载的图像是 254x197 像素 (254*197*4=200,152)。当我使用下面的代码加载我的 Byte 数组时,它只有 16,382 个字节(也不能被 4 等分)。我假设,这是压缩的?...我不知道。

我的问题是,我做错了什么。我想返回代表我应该拥有的 50,038 个像素的 200,152 个字节,这样我就可以创建 GetPixel(x,y) 和 SetPixel(x,y,Color) 方法。

Public Class Bitmap

    Public Sub New()

    End Sub

    Public Async Function Load(s As Windows.Storage.Streams.IRandomAccessStream) As Task
        Dim dr As New DataReader(s.GetInputStreamAt(0))
        Await dr.LoadAsync(s.Size)
        Me.Pixels = New Byte(s.Size - 1) {}
        dr.ReadBytes(Me.Pixels)

        ' We're going to get the height and the width of the image this way. ;)
        Dim bi As New BitmapImage
        Dim stream As New MemoryStream(Me.Pixels)
        bi.SetSource(New RandomStream(stream))
        Me.Width = bi.PixelWidth
        Me.Height = bi.PixelHeight
    End Function

    Public Function ToBitmapImage() As BitmapImage
        Dim bi As New BitmapImage
        Dim stream As New MemoryStream(Me.Pixels)
        bi.SetSource(New RandomStream(stream))
        Return bi
    End Function

    Public Property Pixels As Byte()
    Public Property Width As Integer = 0
    Public Property Height As Integer = 0

End Class
4

1 回答 1

6

我在这里有一个 WinRT 版本的WriteableBitmapEx项目,可以满足您的需求。基本上,您需要将图像加载到 WriteableBitmap 中,然后通过调用 PixelBuffer.AsStream() 访问其像素缓冲区。然后您需要将流寻找到 x,y 位置 (y * bmp.PixelWidth + x) 才能读取像素值。然后还将您获得的 4 个字节转换为适合您的像素格式。

编辑*

WriteableBitmapEx 现在确实原生支持 WinRT。

于 2012-04-16T23:39:40.483 回答