监控端: procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MyBuffer: array[0..10000] of byte; 
  MyReceviceLength: integer;
  S: string;
  MyBmp: TBitmap;
  MyJpg: TJpegimage;
begin
  StatusBar1.SimpleText := '正在接收数据......';
  if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
  begin
    S := Socket.ReceiveText;
    MySize := Strtoint(S); 
    Clientsocket1.Socket.SendText('ready'); 
  end
  else begin 
    MyReceviceLength := socket.ReceiveLength; 
    StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
    Socket.ReceiveBuf(MyBuffer, MyReceviceLength); 
    MyStream.Write(MyBuffer, MyReceviceLength); 
  if MyStream.Size >= MySize then 
    begin
      MyStream.Position := 0;
      MyBmp := tbitmap.Create;
      MyJpg := tjpegimage.Create;
      try
        MyJpg.LoadFromStream(MyStream); 
        MyBmp.Assign(MyJpg);
        StatusBar1.SimpleText := '正在显示图像';
        Image1.Picture.Bitmap.Assign(MyBmp); 
      finally 
        MyBmp.free;
        MyJpg.free;
        Button2.Enabled := true;
        //Socket.SendText('cap');   {添加此句即可连续抓屏 }××××××
        MyStream.Clear;
        MySize := 0;
      end;
    end;
 end; // end of else
 在××××处,可以实现连续抓屏,但是马上溢出,那位老大看看,多谢!!!

解决方案 »

  1.   

    我抓0的图是转化为jpg压缩了一下,还有什么好的办法,我是这样的;      
        Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
          Myjpg.CompressionQuality := 20; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
          Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
          Myjpg.free;然后用流的形式传输的,还有什么好的办法?多谢!!
      

  2.   

    MyStream不用内存流,该成TFileStream试试
      

  3.   

    to aiirii(ari-爱的眼睛) :
      因为这是起到监控作用的,对画质没有很高的要求。:)
    还有,一副位图怎么把它缩小呀?
    在网络传送的时候,还有什么比较好的压缩算法?
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      bitmap:TBitmap;
    begin
      //缩小到窗体
      Canvas.StretchDraw(rect(0,0,Image1.Width div 2,Image1.Height div 2),
                         Image1.Picture.Graphic);
      //缩小到文件
      bitmap:=TBitmap.Create;
      bitmap.Width:=Image1.Width div 2;//宽度缩小一半
      bitmap.Height:=Image1.Height div 2;;//高度缩小一半
      bitmap.Canvas.StretchDraw(bitmap.Canvas.ClipRect,Image1.Picture.Graphic);
      bitmap.SaveToFile('F:\1.bmp');
      bitmap.Free;
    end;
      

  5.   

    从你的代码可看出,你是压缩成jpeg传送的,那么,你在server端,可
    MyJpg.Compress := 
    设置得小,就可压缩比例大点啊!!在 jpeg 的基础上,再压缩的意义就不是很大了!!>>还有,一副位图怎么把它缩小呀?
    简单的用就可StretchDraw
      

  6.   

    我现在用Zlib进行压、解压缩,但是在我的解压缩里,怎么老是
    报“Stream read Error”错误呀,那位帮我看看,多谢!!//解压bitmap
    procedure TForm1.UnCompressBitmap(var MyStream: TMemoryStream);
    var
      SourceStream: TDecompressionStream;
      Buffer: PChar;
      Count: int64;
      DestStream: TMemoryStream;
    begin
      MyStream.ReadBuffer(Count,SizeOf(Count));
      //根据图像尺寸大小为将要读入的原始图像流分配内存块
      GetMem(Buffer,Count);
      DestStream   := TMemoryStream.Create;
      SourceStream := TDecompressionStream.Create(MyStream);  Try
        SourceStream.ReadBuffer(Buffer^,Count);  ××××××××××
        DestStream.WriteBuffer(Buffer^,Count);
        DestStream.Position := 0;
        MyStream.LoadFromStream(DestStream);
        MyStream.Position := 0;
      Finally
        FreeMem(Buffer);
        DestStream.Free;
        SourceStream.Free;
      End;
    end;
    ×××××××××出老是说:Stream read Error!!
    怎么回事?多谢!!!
      

  7.   

    我觉得连续抓屏也不应该有什么带宽的问题,人家视频传输每秒15幅以上不也没啥问题吗(当然可能它的视频图象较小些),你用的socket是TCP方式吧,不如你换UDP方式试试。就用IDUDPSERVER/CLIENT控件