我的错误仅适用于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)
如果你们中的任何人都可以指出错误的位置以及如何纠正错误,那就太好了。
答案 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
非常奇怪。让我感到惊讶的是它确实有效。
1078
是一个没有理由的神奇数字MemoryStream.ToArray()
为您提供了一个与保存的位图大小完全相同的新数组throw;
重新抛出异常而不会丢失堆栈跟踪。