0

このコードを作成してスクリーンショットを撮り、バイトに変換してクライアントに送信しましたが、クライアントがそれを受信すると半分になります。

スクリーンショットをバイトに変換し、クライアントコードに送信するコードは次のとおりです。

 public void SendImage()
        {
            int ScreenWidth = Screen.GetBounds(new Point(0, 0)).Width;
            int ScreenHeight = Screen.GetBounds(new Point(0, 0)).Height;
            Bitmap bmpScreenShot = new Bitmap(ScreenWidth, ScreenHeight);



            Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
            gfx.CopyFromScreen(0, 0, 0, 0, new Size(ScreenWidth, ScreenHeight));
            bmpScreenShot.Save(Application.StartupPath + "/ScreenShot.jpg", ImageFormat.Jpeg);
            byte[] image = new byte[10000*10000*10];
            bmpScreenShot = ResizeBitmap(bmpScreenShot, 300, 300);
            image = ImageToByte(bmpScreenShot);



            sck.Send(image, 0, image.Length, 0);

        }

そして、ここに受信コードがあります

public void ReceiveImage()
    {

        if (sck.Connected)
        {

            {
                NetworkStream stream = new NetworkStream(sck);
                byte[] data = new byte[10000 * 10000 * 3];
                string receive = string.Empty;
                Int32 bytes = stream.Read(data, 0, data.Length);
                pictureBox1.Image = byteArrayToImage(data);

            }
        }
    }
4

2 に答える 2

2

1000 * 1000 * 10バイトを送信し、1000 * 1000*3バイトを受信して​​います。

また、さらにある限り、ストリームから読み取るようにしてください。

より安全な方法は、最初に配列のサイズを送信することです。

したがって、画像をJPGに変換した後、バイト数を取得し、この量を4バイトで送信し、これらの4バイトを読み取り、そのサイズのバッファーを準備して、ストリームを読み取ります。

その他のヒント

image = ImageToByte(bmpScreenShot);

// get the encoded image size in bytes
int numberOfBytes = image.Length;

// put the size into an array
byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);

// send the image size to the server
sck.Send(numberOfBytesArray, 0, numberOfBytesArray.Length, 0);

// send the image to the server
sck.Send(image, 0, numberOfBytes, 0);

サーバ

NetworkStream stream = new NetworkStream(sck);
byte[] data = new byte[4];

// read the size
stream.Read(data, 0, data.Length);
int size = BitConverter.ToInt32(data);

// prepare buffer
data = new byte[size];

// load image
stream.Read(data, 0, data.Length);
于 2012-07-30T16:12:03.590 に答える
2

まず、このコードは壊れています。

byte[] data = new byte[10000 * 10000 * 3];
Int32 bytes = stream.Read(data, 0, data.Length);

への 1 回の呼び出しでデータを受け取ると想定していますRead。それを想定してはいけません - これはストリーミングプロトコルです。0 が返されるまでループするReadか、送信する「メッセージ」の長さをデータの前に付ける必要があります。

さらに、何をするResizeBitmapかは明確ImageToByteではありませんが、必要なバイト数が本当にわからないときに配列を事前に割り当てなければならないのは奇妙です...

于 2012-07-30T16:13:22.327 に答える