【问题标题】:out of memory exception in image.fromFile(Stream)image.fromFile(Stream) 内存不足异常
【发布时间】:2017-01-08 16:56:45
【问题描述】:

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

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

图像 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;

            }
        }

    }

【问题讨论】:

    标签: c# image sockets stream gdi


    【解决方案1】:

    虽然字节已写入缓冲区,但字节可能尚未刷新到磁盘。此外,提供的代码示例在将文件读入图像时保持文件打开以进行写入。对于流之类的东西,您应该将用法包装在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2010-10-05
      相关资源
      最近更新 更多