在C#中捕获屏幕以获得错误的分辨率(1366 x 768)

时间:2011-08-09 10:36:27

标签: c#

我的错误仅适用于1366x768分辨率。它适用于任何其他更高或更低的分辨率。我通过调用系统调用捕获了屏幕。收到的bmp我直接保存,它工作正常。但后来我将其转换为字节流。覆盖到字节流后,我再次尝试保存图像仅用于调试目的,但失败了。

我用来将bmp转换为byte的代码如下

private static byte[] BmpToBytes_MemStream(Bitmap bmp)
    {
        byte[] dst = new byte[(Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height) + 1078];
        try
        {
            MemoryStream stream = new MemoryStream();
            bmp.Save(stream, ImageFormat.Bmp);
            Buffer.BlockCopy(stream.GetBuffer(), 0, dst, 0, dst.Length);
            bmp.Dispose();
            stream.Close();
        }
        catch (Exception exception)
        {
            throw exception;
        }
        return dst;
    }

我使用的代码将此字节流转换回bmp如下,

using (MemoryStream ms = new MemoryStream(fullframe))
            {
                Bitmap bmp = (Bitmap)Image.FromStream(ms);
                bmp.Save(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + frame.ToString() + ".bmp", ImageFormat.Bmp);
            }

我得到的错误如下

错误:System.ArgumentException:参数无效。在System.Drawing.Image.FromStream(Stream stream,Boolean useEmbeddedColorManagement,Boolean validateImageData)    在System.Drawing.Image.FromStream(Stream stream)

如果你们中的任何人都可以指出错误的位置以及如何纠正错误,那就太好了。

2 个答案:

答案 0 :(得分:3)

我不确定您是否必须使用您的代码,但这更简单:

public static Image CaptureScreen(Rectangle bounds, int x, int y)
{
    Bitmap target = new Bitmap(bounds.Width, bounds.Height);
    Graphics.FromImage(target).CopyFromScreen(x, y, 0, 0, new Size(bounds.Width, bounds.Height));

    return (target);
}

public static byte[] ImageToByteArray(Image value)
{
    return ((byte[])new ImageConverter().ConvertTo(value, typeof(byte[])));
}

您可以这样使用它们:

Image i = CaptureScreen(Screen.PrimaryScreen.Bounds, 0, 0);
byte[] b = ImageToByteArray(i);

答案 1 :(得分:0)

很可能是填充问题。我希望每一行都以4字节边界开始。这意味着在此分辨率下每行填充两个字节。

但你的BmpToBytes_MemStream非常奇怪。让我感到惊讶的是它确实有效。

  • dst每个像素只包含一个字节。真彩色每像素需要3-4个字节
  • 它忽略了位图标题,填充,...
  • 1078是一个没有理由的神奇数字
  • 因此没有理由假设保存的位图的大小和dst的大小以任何方式相关
  • MemoryStream.ToArray()为您提供了一个与保存的位图大小完全相同的新数组
  • 你正在使用引发投掷并丢失stacktrace反模式。您可以使用throw;重新抛出异常而不会丢失堆栈跟踪。