发送图像字节

时间:2012-07-30 16:08:10

标签: c# image sockets

我使用此代码截取屏幕截图 - 将其转换为字节 - 将其发送到我的客户端 但是当客户收到它时它就变成了一半。

以下是代码,它将屏幕截图转换为字节,然后将其发送到我的客户端代码:

 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);

            }
        }
    }

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

首先,此代码已损坏:

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

假设您只需拨打Read一次即可收到数据。你不能认为 - 这是一个流式协议。您应该循环,直到Read返回0 ...或者在数据前面加上您要发送的“消息”的长度。

此外,还不清楚ResizeBitmapImageToByte做了什么,但是当你真的不知道你需要多少字节时,必须预先分配数组是很奇怪的。