我用 IdUDPServer 和IdUDPClient 进行图象的传输! 发送: bufferSize:=8192;
......
vStream.Position:=0;
SendCount:=Floor(vStream.Size div 8192);
try
for i:=1 to SendCount do
begin
if i<> 1 then
vStream.Position:=(i-1)*8192 + 1
else
VStream.Position:=0;
SendStream.CopyFrom(vStream,8192);
idUDPClient1.SendBuffer(GStack.LocalAddresses.Strings [0],8090,SendStream,8192);
sendStream.Clear;
end;
if vStream.Size > sendCount*8192 then
begin
vStream.Position:=(vStream.Size-SendCount*8192)+1;
SendStream.CopyFrom(vStream,(vStream.Size-SendCount*8192));
idUDPClient1.SendBuffer(GStack.LocalAddresses.Strings[0],8090,SendStream,SendStream.Size);
end;
Finally
SendStream.Free;
vStream.Free;
end;接收:
tempStream.CopyFrom(AData,AData.Size);
tempStream.Position:=0;
if tempStream.Size =8192 then
imgStream.Write(tempStream,tempStream.Size)
else if (tempStream.Size > 0) and (tempStream.Size < 8192) then
begin
imgStream.WriteBuffer(tempStream,tempStream.Size);
imgStream.Position:=0;
imgDest.Picture.Bitmap.LoadFromStream(imgStream);
end;
tempStream.Free
......
vStream.Position:=0;
SendCount:=Floor(vStream.Size div 8192);
try
for i:=1 to SendCount do
begin
if i<> 1 then
vStream.Position:=(i-1)*8192 + 1
else
VStream.Position:=0;
SendStream.CopyFrom(vStream,8192);
idUDPClient1.SendBuffer(GStack.LocalAddresses.Strings [0],8090,SendStream,8192);
sendStream.Clear;
end;
if vStream.Size > sendCount*8192 then
begin
vStream.Position:=(vStream.Size-SendCount*8192)+1;
SendStream.CopyFrom(vStream,(vStream.Size-SendCount*8192));
idUDPClient1.SendBuffer(GStack.LocalAddresses.Strings[0],8090,SendStream,SendStream.Size);
end;
Finally
SendStream.Free;
vStream.Free;
end;接收:
tempStream.CopyFrom(AData,AData.Size);
tempStream.Position:=0;
if tempStream.Size =8192 then
imgStream.Write(tempStream,tempStream.Size)
else if (tempStream.Size > 0) and (tempStream.Size < 8192) then
begin
imgStream.WriteBuffer(tempStream,tempStream.Size);
imgStream.Position:=0;
imgDest.Picture.Bitmap.LoadFromStream(imgStream);
end;
tempStream.Free
var
m:tmemorystream;
b:tbitmap;
j:tjpegimage;
i:integer;
begin
m:=tmemorystream.create;
m.copyfrom(adata,adata.size);
m.Position:=0;j:=tjpegimage.Create;
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中Image1.Picture.Assign(j); //分配给image1j.free;
m.Free;
end;你试试。另外不要判断8192,你可以在控件上设置其缓冲区为10万。
vStream:=TMemoryStream.Create;
imgSource.Picture.Bitmap.SaveToStream(vStream);
vStream.Position:=0;
idUDPClient1.SendBuffer(GStack.LocalAddresses.Strings[0],8090,vStream,vStream.Size);接收:
tempStream:=TMemoryStream.Create;
bmps:=TBitmap.Create;
tempStream.CopyFrom(AData,AData.Size);
tempStream.Position:=0;
bmps.LoadFromStream(tempstream); 到这句就出错. 图象是bmp.
imgDest.Picture.Bitmap.Assign(bmps);
imgDest.Hint:=IntToStr(tempstream.size);
出错信息是:bitmap image is not valid
我测试了源流和目标流.大小相等.还有但图象为800*600的bmp图象时就出错:socket Error # 10014 Bad Address
发送端:
procedure TForm1.Button1Click(Sender: TObject);
var s : tfilestream ;
d : integer ;
begin
s := tfilestream.Create('e:\唐成.jpg',fmopenread);
s.Position := 0 ;
idtcpclient1.Connect ;
idtcpclient1.WriteStream(s,true,false,s.size);
idtcpclient1.Disconnect ;
end;接受端:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var s : tmemorystream ;
a : integer ;
c : char ;
d : integer ;
j : tjpegimage ;
begin
s := tmemorystream.Create ;
athread.Connection.readstream(s,-1,true) ;
s.Position := 0 ; j := tjpegimage.Create ;
j.LoadFromStream(s); image1.Picture.Assign(j);
j.Free ;
s.Free ;
end;