C# System.Drawing.ImageFromStream处的System.ArgumentException
好的,我看到很多人都有这个问题,我在某种程度上找到了导致这个问题的原因,但我不知道如何解决它。基本上,我试图通过套接字将屏幕截图从客户端发送到服务器。我在客户端应用程序上截图,并使用此方法将其转换为字节数组:C# System.Drawing.ImageFromStream处的System.ArgumentException,c#,sockets,bitmap,memorystream,C#,Sockets,Bitmap,Memorystream,好的,我看到很多人都有这个问题,我在某种程度上找到了导致这个问题的原因,但我不知道如何解决它。基本上,我试图通过套接字将屏幕截图从客户端发送到服务器。我在客户端应用程序上截图,并使用此方法将其转换为字节数组: // Convert bitmap to byte method public static byte[] ImageToByte(Bitmap bitmap) { byte[] imageData; using (var stream = new MemoryStream
// Convert bitmap to byte method
public static byte[] ImageToByte(Bitmap bitmap)
{
byte[] imageData;
using (var stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
imageData = stream.ToArray();
return imageData;
}
}
然后我将字节数组的长度和字节数组发送到服务器。服务器在接收到长度后,使用此方法获取实际数据(这是该方法的一部分,因为大部分数据不相关):
我总是从System.Drawing.ImageFromStream
获得System.ArgumentException
:“参数无效”。这段代码可以很好地发送字符串,但每当我尝试发送图像时,它就不起作用了。我非常确定这是套接字代码的问题,因为我尝试在本地执行此操作,拍摄了一个屏幕截图,使用相同的方法将其转换为字节数组,然后使用相同的方法将其转换回,结果成功了。有人知道我的代码有什么问题吗
下面是缓冲区的部分代码
struct RecBuffer
{
public const int BUFFER_SIZE = 1024;
public byte[] buffer;
public int toRecieve;
public MemoryStream bufStream;
public RecBuffer(int toRec)
{
buffer = new byte[BUFFER_SIZE];
toRecieve = toRec;
bufStream = new MemoryStream(toRecieve);
}
}
我使用了相当多的代码。至少对于接收部件。我认为问题在于您的
datareceivecallback
函数。
在这里,您可以将bufStream的位置重置为零:
if (recieveBuffer.toRecieve > 0)
{
Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
recieveBuffer.bufStream.Position = 0; // <--Here
sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
return;
}
您的代码应该可以正常工作。我认为问题在于您的
datareceivecallback
函数。
在这里,您可以将bufStream的位置重置为零:
if (recieveBuffer.toRecieve > 0)
{
Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
recieveBuffer.bufStream.Position = 0; // <--Here
sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
return;
}
您的代码应该可以正常工作。是否调试了finalBuffer字节[],并查看它们是否与源字节[]匹配?至少可以比较长度和第一个字节。你的接收方法看起来很奇怪。这个ReceiveBuffer是什么类型的类?对不起,我应该发布更多的代码。ReceiveBuffer的代码如下所示:
struct RecBuffer{public const int BUFFER_SIZE=1024;public byte[]BUFFER;public int toRecieve;public MemoryStream bufStream;public RecBuffer(int toRec){BUFFER=new byte[BUFFER_SIZE];toRecieve=toRec;bufStream=newmemoryStream(toRecieve);}
我用了很多这样的代码:我把这段代码放在你原来的帖子里。这样它就不能被正确读取。那么你检查过接收字节了吗[]已经?是的,对不起。我不习惯这种格式。如果你从这个家伙那里得到了代码,那么你为什么不调试代码来找到错误呢?我认为我们不能用整个代码的这个短截图来完成这项工作。你调试了finalBuffer字节[]并查看它们是否与源字节[]匹配吗?至少长度和第一个字节可以比较。你的接收方法看起来很奇怪。这个ReceiveBuffer是什么类型的类?对不起,我应该发布更多的代码。ReceiveBuffer的代码如下:struct RecBuffer{public const int BUFFER_SIZE=1024;public byte[]buffer;public int-toRecieve;public MemoryStream bufStream;public RecBuffer(int-toRec){buffer=new byte[buffer_SIZE];toRecieve=toRec;bufStream=new MemoryStream(toRecieve);}
我用了很多这样的代码:我把这些代码放在你原来的帖子里。这样它就不能被正确读取。那么你检查接收字节了吗[]已经?是的,对不起。我不习惯这种格式。如果你从这个家伙那里得到了代码,那么你为什么不调试代码来找到错误呢?我不认为我们可以在这里用这个简短的剪贴画来完成这项工作。非常感谢!我觉得没有删除它太愚蠢了,我在示例代码中基于了这个o的一部分ff,我只是没怎么想。@user1742916:不客气!请点击投票箭头下方的空心复选标记来接受我的答案。非常感谢!我觉得没有删除它太愚蠢了,我只是在示例代码中基于这一部分,我只是没怎么想。@user1742916:不客气!请接受我的回答通过单击投票箭头下方的空心复选标记进行投票。
if (recieveBuffer.toRecieve > 0)
{
Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
recieveBuffer.bufStream.Position = 0; // <--Here
sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
return;
}
recieveBuffer.bufStream.Position = 0;