将内存中的字节复制到VB.NET中的数组

时间:2009-11-12 22:01:11

标签: vb.net memory bitmap marshalling bytearray

不幸的是,我无法在当前项目中使用C#,因此我必须在没有 unsafe 关键字的情况下解决此问题。

我有一个位图,我需要直接访问像素和通道值。我想超越Marshal.ReadByte()和Marshal.WriteByte()(绝对超越GetPixel和SetPixel)。

有没有办法将位图的所有像素数据放入可在32位和64位系统上运行的Byte数组?我想要与原始位图完全相同的布局,因此每行(如果存在)的填充也需要包含在内。

马歇尔似乎没有类似的东西:

byte[] ReadBytes(IntPtr start, int offset, int count)

除非我完全错过了......

任何帮助非常感谢, 大卫

PS。到目前为止,我的所有图像都是32BppPArgb pixelformat。

4 个答案:

答案 0 :(得分:2)

Marshal确实有一个方法可以完全按照你的要求行事。见Marshall.Copy()

public static void Copy(
    IntPtr source,
    byte[] destination,
    int startIndex,
    int length
   )
  

从非托管内存中复制数据   指向托管8位无符号的指针   整数数组。

还有重载也是另一个方向

答案 1 :(得分:1)

VB不提供直接内存访问的方法。你有两个选择:

  1. 使用Marshal类
  2. 编写一个小的不安全的C#(或C ++ / CLI)库,它只处理这些操作并从VB代码中引用它。
  3. 好的,还有第三种选择。 VB.Net本身并不支持直接内存访问,但可以实现。它只是丑陋而容易出错。尽管如此,如果您愿意付出努力,可以尝试使用these techniques结合之前引用的方法构建位图访问库。

答案 2 :(得分:1)

会这样吗? (另):

Public Shared Function BytesFromBitmap(ByVal Image As Drawing.Bitmap) As Byte()
   Using buffer As New IO.MemoryStream()
        image.Save(result, Drawing.Imaging.ImageFormat.Bmp)

        Using rdr As New IO.BinaryReader(buffer)
            Return rdr.ReadBytes(buffer.Length)
        End Using
    End Using
End Function

它不会让你直接操纵Drawing.Bitmap对象中的像素,但它会让你将该位图复制到一个字节数组,按照问题标题。

另一种选择是通过BinaryFormatter进行序列化,但我认为仍然需要你通过MemoryStream传递它。

答案 3 :(得分:1)

shf301是对的,但我想添加一个关于快速像素数据访问的综合解释/教程的链接。不是将图像保存到流中并访问内存中的文件,最好是锁定位图,复制像素数据,访问它,然后将其复制回来。这种技术的性能非常好。 / p>

代码在c#中,但该方法与语言无关且易于阅读。

http://ilab.ahemm.org/tutBitmap.html