image.fromFile(Stream)中的内存不足异常

时间:2016-09-01 00:06:06

标签: c# image sockets stream gdi

我搜索了所有类似的问题,但仍然无法解决问题

这是一个成功运行的服务器代码,图像文件创建成功但是如果我无法访问图像文件

image i = Image.FromStream(StreamObject);

注意: 1-图像不太大 2-图像具有有效的图像格式

我知道与流有关的问题......我该如何控制这个问题 我想因某种原因在图像对象中检索已保存的图像。  如何在图像的生命周期内保持流打开。??

static void Main(string[] args)
    {
        IPAddress ipAdress = IPAddress.Parse("192.160.1.8");
        // Initializes the Listener
        TcpListener tcpListener = new TcpListener(ipAdress, 8001);
        tcpListener.Start();
        int no;
        for (;;)
        {
            Socket socket = tcpListener.AcceptSocket();
            if (socket.Connected)
            {

                Stream os = File.OpenWrite("Target.jpg",);
                byte[] buffer = new byte[8000000];
                NetworkStream networkStream = new NetworkStream(socket);
                no = networkStream.Read(buffer, 0, 8000000);
                os.Write(buffer, 0, no);
                ///here the problem in the following line
                ///
                   Image i = Image.FromFile("Target.jpg");
                ///
                networkStream.Close();
                socket.Close();
                break;

            }
        }

    }

1 个答案:

答案 0 :(得分:1)

当字节已写入缓冲区时,字节可能尚未刷新到磁盘。此外,提供的代码示例在文件被读入图像时保持文件打开以进行写入。对于像stream这样的东西,你应该在using语句中包含用法,以避免这些类型的内存错误。

static void Main(string[] args)
{
    IPAddress ipAdress = IPAddress.Parse("192.160.1.8");
    // Initializes the Listener
    TcpListener tcpListener = new TcpListener(ipAdress, 8001);
    tcpListener.Start();
    int no;
    for (;;)
    {
        Socket socket = tcpListener.AcceptSocket();
        if (socket.Connected)
        {
            byte[] buffer = new byte[8000000];
            using (Stream os = File.OpenWrite("Target.jpg")) 
            {
                using (NetworkStream networkStream = new NetworkStream(socket)) 
                {
                    no = networkStream.Read(buffer, 0, 8000000);
                    os.Write(buffer, 0, no);
                }
            }


            ///here the problem in the following line
            ///
               Image i = Image.FromFile("Target.jpg");
            ///

            socket.Close();
            break;

        }
    }

}

或者,可能更合适,您应该考虑使用Image.FromStream直接从流中创建GDI +图像。此处记录了Image.FromStream方法:https://msdn.microsoft.com/en-us/library/system.drawing.image.fromstream%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396