不幸的是,我无法在当前项目中使用C#,因此我必须在没有 unsafe 关键字的情况下解决此问题。
我有一个位图,我需要直接访问像素和通道值。我想超越Marshal.ReadByte()和Marshal.WriteByte()(绝对超越GetPixel和SetPixel)。
有没有办法将位图的所有像素数据放入可在32位和64位系统上运行的Byte数组?我想要与原始位图完全相同的布局,因此每行(如果存在)的填充也需要包含在内。
马歇尔似乎没有类似的东西:
byte[] ReadBytes(IntPtr start, int offset, int count)
除非我完全错过了......
任何帮助非常感谢, 大卫
PS。到目前为止,我的所有图像都是32BppPArgb pixelformat。
答案 0 :(得分:2)
Marshal确实有一个方法可以完全按照你的要求行事。见Marshall.Copy()
public static void Copy(
IntPtr source,
byte[] destination,
int startIndex,
int length
)
从非托管内存中复制数据 指向托管8位无符号的指针 整数数组。
还有重载也是另一个方向
答案 1 :(得分:1)
VB不提供直接内存访问的方法。你有两个选择:
好的,还有第三种选择。 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#中,但该方法与语言无关且易于阅读。