私がやろうとしているのは、クライアントの画面の画像をサーバーに転送することです。これを行うには、クライアント側で画面の画像を取得し、それをバイト配列に変換して、そのバイト配列を TCP ソケット経由でサーバーに送信します。サーバー側ではクライアントからのバイト配列を画像に変換してpictureBoxに入れています。
さて、結果はクライアント側ではクールに見えますが、サーバー側で得られる画像は歪んでいます:
右の写真がクライアント側(画面を保存してサーバーに送信する)で、左がサーバー側です。サーバー側でわかるように、picutre はいっぱいではありません。
これらのコードを使用して、画像を送信し、画像を受信し、変換します(バイト>画像||画像>バイト):
private Image getScreen()
{
Size s = Screen.PrimaryScreen.Bounds.Size;
Bitmap b = new Bitmap(s.Height, s.Width);
Graphics g = Graphics.FromImage(b);
g.CopyFromScreen(0, 0, 0, 0, s);
return b;
}
private byte[] BmpToBytes(Image bmp)
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.GetBuffer();
bmp.Dispose();
ms.Close();
return bmpBytes;
}
private Image BytesToImg(byte[] bmpBytes)
{
MemoryStream ms = new MemoryStream(bmpBytes);
Image img = Image.FromStream(ms);
return img;
}
Client side:
private void SendScreenToServer()
{
while (true)
{
byte[] sendBytes = new byte[12500];
sendBytes = BmpToBytes(getScreen());
pictureBox1.Image = getScreen();
serverStream.Write(sendBytes, 0, sendBytes.Length);
serverStream.Flush();
}
}
Server side:
private void GetScreenFromClient()
{
while (true)
{
byte[] bytesFrom = new byte[12500];
networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
try
{
pictureBox1.Image = BytesToImg(bytesFrom);
}
catch { }
}
}
誰が私が間違っているのか知っていますか? または、ソケットを介してイメージを転送する他のオプションはありますか?