Windows XP上的C#屏幕截图
我制作了一个简单的程序,截图,加密到base64并通过套接字连接发送,它在我的笔记本电脑(Windows 7)上运行良好,但当我在其他计算机(Windows XP)上尝试时,当我试图将base64文本转换回图像时,它会说“参数无效”,下面是我的代码: 客户:Windows XP上的C#屏幕截图,c#,windows,sockets,windows-xp,screenshot,C#,Windows,Sockets,Windows Xp,Screenshot,我制作了一个简单的程序,截图,加密到base64并通过套接字连接发送,它在我的笔记本电脑(Windows 7)上运行良好,但当我在其他计算机(Windows XP)上尝试时,当我试图将base64文本转换回图像时,它会说“参数无效”,下面是我的代码: 客户: public static Image Do_CaptureDesktop() { Rectangle bounds = default(Rectangle); System.Drawing.Bitmap screensho
public static Image Do_CaptureDesktop()
{
Rectangle bounds = default(Rectangle);
System.Drawing.Bitmap screenshot = null;
Graphics graph = default(Graphics);
bounds = Screen.PrimaryScreen.Bounds;
screenshot = new Bitmap(
bounds.Width,
bounds.Height,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
graph = Graphics.FromImage(screenshot);
graph.CopyFromScreen(
bounds.X,
bounds.Y, 0, 0,
bounds.Size,
CopyPixelOperation.SourceCopy);
return screenshot;
}
public static string Do_ImageToBase64(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
public static void Do_prepareImage()
{
Image screen = Do_CaptureDesktop();
string base64Screen = Do_ImageToBase64(screen, ImageFormat.Png);
byte[] Screens = Encoding.Unicode.GetBytes(base64Screen);
byte[] Header = Encoding.Unicode.GetBytes("S1");
byte[] Datas = new byte[Screens.Length + Header.Length];
Header.CopyTo(Datas, 0);
Screens.CopyTo(Datas, Header.Length);
Socket.Send(Datas);
}
private static void ConnectToServer()
{
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
Console.WriteLine("Connection attempt " + attempts);
try
{
_clientSocket.Connect(IPAddress.Parse("192.168.1.1"), 100);
}
catch (SocketException)
{
}
}
catch (SocketException)
{
Console.Clear();
}
}
Console.Clear();
Console.WriteLine("Connected");
}
static void Main(string[] args)
{
ConnectToServer();
Do_prepareImage();
}
服务器:
public static Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = new byte[4];
try
{
imageBytes = Convert.FromBase64String(base64String);
}
catch (Exception)
{
}
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true); //Here is the error
return image;
}
public static void ParsePacket(string packet)
{
if (packet.Substring(1,1).Equals("1"))
{
string stringImage = packet.Substring(2, packet.Length - 2);
//The line above remove the packet name and leave just the base64 text
try
{
Image screen = Base64ToImage(stringImage);
pictureBox1.Image = screen;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
我在服务器端有另一个函数,它将接收到的数据包发送到“ParsePacket”函数。
编辑:我重复一下,它在Windows 7上运行良好。我认为问题在于您忽略了由以下内容生成的错误:
try
{
imageBytes = Convert.FromBase64String(base64String);
}
catch (Exception)
{
}
因此,当你打电话时:
Image image = Image.FromStream(ms, true);
您正在解析一个4字节的空数组(为什么要将它初始化为这个?)
方法通常写得很糟糕,将其更改为此,然后查看错误的真正原因:
public static Image Base64ToImage(string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
using (MemoryStream ms = new MemoryStream(imageBytes))
{
return Image.FromStream(ms, true);
}
}
虽然您在服务器中的receive方法不包括在内,但我认为您遇到了一个问题,我在这里已经见过好几次了,因此: 通过TCP接收数据可以只提供发送消息的一部分,以及几乎同时发送的多条消息 正如我在客户端代码中看到的,在客户端和服务器之间的协议中没有任何长度信息或结束令牌。您需要某种类型的信息来识别您是否收到了完整的消息或只是其中的一部分(甚至在一次突发中收到了两条消息) 在服务器的接收方法中,您必须将接收到的数据存储在缓冲区中,直到您知道(根据您的协议)已接收到完整的消息为止。您可以处理此消息并将其从缓冲区中删除 我猜错误消息是一条不完整的消息的结果,该消息应该被转换成图像
代码在本地主机上工作,因为消息可以通过环回设备发送,而无需将其拆分,因此您可以将其作为一部分接收。在哪一行发生错误?base64不是加密。您对Base64进行编码/解码。好的,谢谢您的更正:)@iabbott:Image Image=Image.FromStream(ms,true)//以下是您应该删除行
ms.Write(imageBytes,0,imageBytes.Length)的错误代码>!流已包含构造后的字节。。。可能是上游位置混乱导致了例外情况可能有帮助的是,如果你给我们的是base64编码字符串,你得到的字符串将无法解码。我没有给你一个解决方案。。。请公布“我的版本”中出现的错误。@user2695010,错误消息说明的不止这些。请发布完整的错误消息,包括堆栈跟踪。