c#将图像转换为字节数组

时间:2015-06-29 16:09:08

标签: c# byte screenshot

我正在寻找一种更快的解决方案,使用常规方法将图像转换为字节数组:

   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()

1 个答案:

答案 0 :(得分:0)

对于消极的步幅,MSDN doc说:

  

步幅是单行像素(扫描线)的宽度,向上舍入为四字节边界。如果步幅为正,则位图为自上而下。如果步幅是负数,则位图是自下而上的。

您的位图是自下而上的。在这里看看这个很好的解释:https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx

要复制字节,您需要像在这个答案中一样计算起始地址:https://stackoverflow.com/a/17116072/200443

如果要反转字节顺序,则需要一次复制一行。