在c#中从Windows Mobile的流中获取图像

本文关键字:获取 图像 Mobile 中从 Windows | 更新日期: 2023-09-27 18:06:16

我正在尝试接收图像形式服务器,并希望在WM应用程序中将其显示为图片框。我成功地接收了图像流,但我找不到任何方法将其显示到PictureBox中。在windows程序中,我们在Image类中有一个方法是FromStream (Image.FromStream),但这个函数在Compact Framework 3.5中不可用。我还尝试了以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress IP = IPAddress.Parse("192.168.1.2");
        IPEndPoint IPE = new IPEndPoint(IP, 4321);
        s.Connect(IPE);
        byte[] buffer = new byte[55296];
        s.Receive(buffer, buffer.Length, SocketFlags.None);
        MemoryStream ms = new MemoryStream(buffer);
        Image im = new Bitmap(ms); //EXCEPTION
        pictureBox1.Image = im; 
    }

但是它给出了一个异常。没有提供异常的详细信息,VS只显示一个带有"exception"文本的对话框。

在c#中从Windows Mobile的流中获取图像

您的图像大小是否小于缓冲区的大小?如果不是,则丢失所有多余的数据并抛出异常。

如果没有指定缓冲区长度,也可以尝试。

        using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            IPAddress IP = IPAddress.Parse("192.168.1.2");
            IPEndPoint IPE = new IPEndPoint(IP, 4321);
            s.Connect(IPE);
            byte[] buffer = new byte[55296];
            int rec = s.Receive(buffer, SocketFlags.None);
            using (MemoryStream ms = new MemoryStream(buffer, 0, rec))
            {
                Image im = new Bitmap(ms);
                pictureBox1.Image = im;
            }
        }

您必须检查套接字的Receive方法的返回值才能确定位图缓冲区的大小:

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPAddress IP = IPAddress.Parse("192.168.1.2");
    IPEndPoint IPE = new IPEndPoint(IP, 4321);
    s.Connect(IPE);
    byte[] buffer = new byte[55296];
    int rec = s.Receive(buffer, buffer.Length, SocketFlags.None);
    MemoryStream ms = new MemoryStream(buffer, 0, rec);
    Image im = new Bitmap(ms);
    pictureBox1.Image = im;

希望有帮助。