わかりました、この問題を抱えている人を複数見てきました。問題の原因をある程度突き止めましたが、修正方法がわかりません。基本的に、ソケット経由でクライアントからサーバーにスクリーンショットを送信しようとしています。クライアント アプリケーションでスクリーンショットを撮り、次のメソッドを使用してバイト配列に変換します。
// 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;
}
}
次に、バイト配列の長さとバイト配列をサーバーに送信します。サーバーは、長さを受け取った後、このメソッドを使用して実際のデータを取得します (ほとんどのデータは関係ないため、これはメソッドの一部です)。
void dataRecieveCallback(IAsyncResult ar)
{
try
{
int rec = sck.EndReceive(ar);
if (rec <= 0)
{
return;
}
recieveBuffer.bufStream.Write(recieveBuffer.buffer, 0, rec);
recieveBuffer.toRecieve -= rec;
if (recieveBuffer.toRecieve > 0)
{
Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
recieveBuffer.bufStream.Position = 0;
sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
return;
}
// Convert all recieved data in memory stream to a byte array
byte[] finalBuffer = recieveBuffer.bufStream.ToArray();
次に、を使用しfinalBuffer
て画像を取得しようとしますが、取得するたびに、次の方法を使用します。
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
Bitmap screenShot = (Bitmap)tc.ConvertFrom(finalBuffer);
私はいつも「パラメータが無効です」というメッセージSystem.ArgumentException
を受け取ります。System.Drawing.ImageFromStream
このコードは文字列の送信には問題なく機能しましたが、画像を送信しようとすると機能しません。スクリーンショットを撮り、同じ方法を使用してバイト配列に変換し、同じ方法を使用して元に戻すことでローカルでこれを実行しようとしたため、ソケットコードの問題であると確信しています。ここで私のコードの何が問題なのか知っている人はいますか?
これはバッファのコードの一部です
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);
}
}
このチュートリアルのかなりのコードを使用しました。少なくとも受け側は。