我正在尝试学习如何与图像的一些 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