各位能者,请问一下:
 我想做一个界面能用互联网传送图片,结果出现了如标题的情况,
图片是传送成功了,但图像变样了,颜色变得乱七八槽了,我猜原因是因为接收的流会比发送的流大的原故,但不知道怎么办,请各位帮我解惑一下。
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
 SendSize:integer;
 Buf:array[0..10000] of byte;
 s,l,ii:string;
begin
   //memo1.Lines.Text:=clientsocket1.Socket.ReceiveText;
   s:=socket.ReceiveText;
   if (s='ok') then clientsocket1.Socket.SendText(inttostr(myStream.Size));
   if (s='data') then clientsocket1.Socket.SendStream(myStream);
   if (s='over') then label2.Caption:='图像接收完毕'; 
end;
if(size1<>0) and (go1=true) then
          begin
            myStream2:=TMemoryStream.Create;
            repeat
                  //myStream:=TMemoryStream.Create;
                  len:=socket.ReceiveLength;
                  label2.Caption :='&#210;&#209;&#189;&#211;&#202;&#213;:'+inttostr(len);
                  socket.ReceiveBuf(buffer,len);
                  myStream2.write(buffer,len);
                 // myStream.Seek(0,soFromBeginning);
                  //myStream2.Seek(0,soFromEnd);
                 // myStream2.CopyFrom(myStream,0);
                  //myStream.free;
               until myStream2.Size>=size1;
            socket.SendText('over');
            edit1.Text:='dx:'+inttostr(myStream2.Size);
end;
结果接收的流会比发送的流大?

解决方案 »

  1.   

    没遇过你这样的问题,下面是我的代码发送:
    var
      hr: HRESULT;
      BIHeaderPtr: PBitmapInfoHeader;
      MediaType: TAMMediaType;
      BitMapHandle: HBitmap;
      DIBPtr: Pointer;
      jpg: TJpegImage;
      memStream: TMemoryStream;
    begin
      Image.Canvas.Lock;
      try
        hr := Grabber.SampleGrabber.GetConnectedMediaType(MediaType);
        if hr <> S_OK then
          Exit;
        try
          if IsEqualGUID(MediaType.majortype, MEDIATYPE_Video) then
          begin
            BIHeaderPtr := nil;
            if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
              if MediaType.cbFormat = SizeOf(TVideoInfoHeader) then
                BIHeaderPtr := @(PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
            if not Assigned(BIHeaderPtr) then
              Exit;
            BitmapHandle := CreateDIBSection(0, PBitmapInfo(BIHeaderPtr)^, DIB_RGB_COLORS, DIBPtr, 0, 0);
            if BitmapHandle <> 0 then
            begin
              if DIBPtr = nil then
                Exit;
              if BufferLen > Integer(BIHeaderPtr^.biSizeImage) then
                BufferLen := BIHeaderPtr^.biSizeImage;
              Move(pBuffer^, DIBPtr^, BufferLen);
              Image.Picture.Bitmap.Handle := BitmapHandle;
            end;
          end;
        finally
          FreeMediaType(@MediaType);
        end;
        memStream := TMemoryStream.Create;
        jpg := TJpegImage.Create;
        jpg.Assign(Image.Picture.Bitmap);
        jpg.CompressionQuality := 80;
        jpg.JPEGNeeded;
        jpg.Compress;
        jpg.SaveToStream(memStream);
        jpg.Free;
        try
        IdUDPServer1.SendBuffer('192.168.1.88',8581,memStream.Memory^, memStream.Size);
        except
          IdUDPServer1.Active := false;
          IdUDPServer1.Active := true;
        end;
        memStream.Free;
      finally
        Image.Canvas.Unlock;
      end;
    end;接收:
    procedure TServerForm.TCPServerExecute(AThread: TIdPeerThread);
    var
      memStream: TMemoryStream;
      jpg: TJpegImage;
      BufferLen: Integer;
    begin
      if AThread.Connection.Connected and not AThread.Terminated then
      begin
        memStream := TMemoryStream.Create;
        BufferLen := AThread.Connection.ReadInteger;
        memStream.Size := BufferLen;
        AThread.Connection.ReadBuffer(memStream.Memory^, BufferLen);
        jpg := TJpegImage.Create;
        jpg.LoadFromStream(memStream);
        Image.Picture.Bitmap.Assign(jpg);
        jpg.Free;
        memStream.Free;
      end;
    end;
      

  2.   

    http://www.somade.com/是个很专业的技术社区,去那里找找吧,或许有你要的答案~