我正在寻找一种更快的解决方案,使用常规方法将图像转换为字节数组:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
所以我搜索并找到了这个
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
numbytes = Math.Abs(numbytes);
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
bitmap.UnlockBits(bmpdata);
return bytedata;
}
这是我的电话:
` private void Form1_Load(object sender, EventArgs e)
{
Bitmap curr = GetDesktopImage();
byte[] buff = BitmapToByteArray(curr);
}
比我得到了一个expcetion arithmetic operation resulted in an overflow
,我发现numbofbytes
是负数,所以它无法生成数组所以我使用Math.Abs()
但是我在该行上得到了另一个错误{ {1}}和错误:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。为什么会发生这种情况?
Marshal.Copy(ptr, bytedata, 0, numbytes);
是一种方法,我使用gdi根据this截取屏幕截图并且该方法是实际的(我试图在图片框上显示)但是在尝试转换为字节时我面临着奇怪的错误。
这是GetDesktopImage()
GetDesktopImage()
答案 0 :(得分:0)
对于消极的步幅,MSDN doc说:
步幅是单行像素(扫描线)的宽度,向上舍入为四字节边界。如果步幅为正,则位图为自上而下。如果步幅是负数,则位图是自下而上的。
您的位图是自下而上的。在这里看看这个很好的解释:https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx
要复制字节,您需要像在这个答案中一样计算起始地址:https://stackoverflow.com/a/17116072/200443。
如果要反转字节顺序,则需要一次复制一行。