客服端描述:MyFirstBmp是内存流,已经存入了个32bit色的图片,发送到服务端的时候为什么服务端会主动关闭程序?发送8bit的图片就不会,而且能在TImage画布出来 
客服端发送图片代码 :   
   Form1.IdTCPClient1.WriteInteger(MyFirstBmp.Size);
      Form1.IdTCPClient1.WriteBuffer(MyFirstBmp.Memory^,MyFirstBmp.Size,true);
服务端接受图片代码:
var 
  MyFirstBmp:TMemoryStream;
  BufferLen :Integer; 
  MyBuffer: array[0..1000000] of Byte;
begin
  BufferLen:= AThread.Connection.ReadInteger();
  AThread.Connection.ReadBuffer(MyBuffer,BufferLen);
  MyFirstBmp:=TMemoryStream.Create
  MyFirstBmp.Clear;     
  MyFirstBmp.Write(MyBuffer,BufferLen);//
  MyFirstBmp.Position := 0;
  TempBmp:=TBitmap.Create;
  TempBmp.LoadFromStream(MyFirstBmp);
  Image1.Width := TempBmp.Width;
  Image1.Height := TempBmp.Height;
  Image1.Canvas.Draw(0,0,TempBmp);
  MyFirstBmp.free;
end;

解决方案 »

  1.   

    MyBuffer: array[0..1000000] of Byte;
    这意味着传输的图片大小不能超过1000001个字节, 约977KB。超过的话,服务器端将出现异常。
      

  2.   

    建议修改成:var 
      MyFirstBmp:TMemoryStream; 
      BufferLen :Integer; 
      MyBuffer: array of Byte; 
    begin 
      BufferLen:= AThread.Connection.ReadInteger(); 
      SetLength(MyBuffer, BufferLen);
      AThread.Connection.ReadBuffer(MyBuffer[0], BufferLen); 
      MyFirstBmp:=TMemoryStream.Create; 
      try
        MyFirstBmp.Clear;    
        MyFirstBmp.Write(MyBuffer[0], BufferLen);
        MyFirstBmp.Position := 0; 
        TempBmp:=TBitmap.Create; 
        try
          TempBmp.LoadFromStream(MyFirstBmp); 
          Image1.Width := TempBmp.Width; 
          Image1.Height := TempBmp.Height; 
          Image1.Canvas.Draw(0, 0, TempBmp); 
        finally
          TempBMP.Free;
        end;
      finally
        MyFirstBmp.Free; 
      end;
      MyBuffer := nil;
    end;
      

  3.   

    图片好几MB,我吧MyBuffer: array[0..1000000] of Byte;改成了MyBuffer: array[0..10000000] of Byte;怎么画不出图片来?请问该怎么办?
      

  4.   

    其实你服务端的代码中的MyBuffer是有点多余的, TIdPeerThread.Connection有个ReadStream方法, 可以直接读取数据到TStream的。
    var 
      MyFirstBmp: TMemoryStream; 
      BufferLen : Integer; 
    begin 
      BufferLen := AThread.Connection.ReadInteger(); 
      MyFirstBmp := TMemoryStream.Create; 
      try
        MyFirstBmp.Position := 0; 
        AThread.Connection.ReadStream(MyFirstBmp, BufferLen);
        TempBmp := TBitmap.Create; 
        try
          MyFirstBmp.Position := 0;            //需要补上这一句
          TempBmp.LoadFromStream(MyFirstBmp); 
          Image1.Width := TempBmp.Width; 
          Image1.Height := TempBmp.Height; 
          Image1.Canvas.Draw(0, 0, TempBmp); 
        finally
          TempBMP.Free;
        end;
      finally
        MyFirstBmp.Free; 
      end;
    end;