如何编写流传输图像的程序? 在Delphi6 下如何用 ServerSocket 和 ClientSocket 编写流传输图像的程序,希望能提供源码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 傳送文件可用, 將 FileStream 改為你的 流图像就可unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls; type TForm1 = class(TForm) ClientSocket1: TClientSocket; ServerSocket1: TServerSocket; btnTestSockets: TButton; procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure btnTestSocketsClick(Sender: TObject); private FStream: TFileStream; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var iLen: Integer; Bfr: Pointer; begin iLen := Socket.ReceiveLength; GetMem(Bfr, iLen); try Socket.ReceiveBuf(Bfr^, iLen); FStream.Write(Bfr^, iLen); finally FreeMem(Bfr); end; end; procedure TForm1.FormCreate(Sender: TObject); begin FStream := nil; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FStream) then begin FStream.Free; FStream := nil; end; end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin if Assigned(FStream) then begin FStream.Free; FStream := nil; end; end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite); end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite)); end; procedure TForm1.btnTestSocketsClick(Sender: TObject); begin ServerSocket1.Active := True; ClientSocket1.Active := True; end; end. 流图像转输与接收部份的代码,请大侠再帮我看看:-----------------Server------------------------procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);var linkcmd:string; Mybmp: Tbitmap; MyStream: TMemoryStream; //采集数据流 MyJpg:Tjpegimage;begin linkcmd:=Socket.ReceiveText; if linkcmd='传送图像' then ; begin MyStream := TMemoryStream.Create; try MyJpg:=Tjpegimage.Create; Mybmp := TBitmap.Create; GetScreen(mybmp); //--获取 mybmp 图像 Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输} Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大} MyStream.Clear; Myjpg.SaveToStream(MyStream); {将JPG图象写入流中} Myjpg.free; MyStream.Position := 0 Socket.SendStream(mystream); finally MyBmp.free; mystream.Free; end; end;end;-----------------client------------------------procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);var mystream:TMemorystream; myjpg:tjpegimage; iLen: Integer; Bfr: Pointer;begin iLen := Socket.ReceiveLength; GetMem(Bfr, iLen); MyStream.Position := 0; try Socket.ReceiveBuf(Bfr^, iLen); mystream.Write(Bfr^, iLen); finally FreeMem(Bfr); end; myjpg:=Tjpegimage.Create; myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中} image1.Picture.Assign(myjpg); //--将收到的图像显示出来 image1.Free; mystream.Free;end; MyStream.Position := 0;myjpg.LoadFromStream(MyStream);image1.Picture.Assign(myjpg); //--将收到的图像显示出来 还是不行, 加分再求助。Server端 用 mystream.SaveToFile('c:\temp\123.jpg');已能将流的内容正确保存为图片,但到 client 无法接收到正确的数据,怀凝是图片太大(100-200KB)那位能够给一段把流分段传送的代码。 看看我的代码,希望能对你有所帮助//--定义常量const MP_Read='1'; //--准备发送数据 MP_Info='2'; //--发送的数据信息 Mp_Data='3'; //--发送数据----------Server----------------procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);var linkcmd:string; Mybmp: Tbitmap; //Buf:pointer; buf:array[1..8192] of byte; sendsize: integer; //每次发送的大小 bufsize:integer;begin linkcmd:=trim(Socket.ReceiveText); case linkcmd[1] of MP_Read: begin MyStream := TMemoryStream.Create; MyJpg:=Tjpegimage.Create; Mybmp := TBitmap.Create; GetScreen(mybmp); //bmpmap.PixelFormat :=pf8bit; //监看颜色降至为256色 Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输} Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大} image1.Picture.Assign(myjpg); //--显示取得的图 //image1.Picture.Bitmap.Assign(mybmp); MyStream.Clear; Myjpg.SaveToStream(MyStream); {将JPG图象写入流中} Myjpg.free; Jpgsize:=mystream.Size; socket.SendText(Mp_Info+inttostr(jpgsize)); mystream.SaveToFile('c:\temp\55.jpg'); mystream.Position:=0; edit2.Text:=inttostr(jpgsize); fssize:=0; //--传送字节数置0 MyBmp.free; end; MP_Data: begin bufsize:=sizeof(buf); if JpgSize > BufSize then SendSize := BufSize else SendSize := JpgSize; mystream.ReadBuffer(Buf, SendSize); JpgSize := JpgSize - SendSize; fssize:=fssize+sendsize; edit3.Text :=inttostr(fssize); if JpgSize = 0 then begin MyStream.Clear; { 清空流 } MyStream.Free; end; socket.SendBuf(buf,SendSize); { 将数据发到主控机 } end; end;end;----------Client----------------procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);var myjpg:tjpegimage; ilen:integer; buf:array[1..8192] of byte ; BufSize:integer; scmd:string;begin if bReadText then begin scmd:=socket.ReceiveText; if scmd[1]=MP_Info then begin ilen:=length(scmd); jpgsize:=strtoint(copy(scmd,2,ilen-1)); edit3.Text:=inttostr(jpgsize); //--显示所接收的总字节数 mystream:=TMemorystream.Create; mystream.clear; socket.SendText(Mp_Data); bReadText:=false; end; end else begin BufSize:=sizeof(buf); if jpgsize > BufSize then RecSize := BufSize else RecSize := jpgsize; socket.ReceiveBuf(buf, RecSize); jpgSize := jpgSize - RecSize; edit4.Text:=inttostr(jpgsize); //--显示还剩余的字节数 mystream.WriteBuffer(buf,recsize); if jpgsize = 0 then //读完数据 begin mystream.Position := 0; myjpg:=Tjpegimage.Create; myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中} image1.Picture.Assign(myjpg); //--显示图片 mystream.SaveToFile('c:\temp\555.jpg'); //--将收到的图片临时保存 end else socket.SendText(MP_data);end;end; 怎么做字符串的反转,要求最优算法 请求帮助,delphi IdHTTP POS ???如何分别提取字符串中的所有数字、汉字、字母? 初学delphi请问一个简单得问题 望解答 错误处理程序如何再返回到程序中 如何将其它数据库的数据导入DELPHI的TABLE表中?? Intraweb开发的网页使用IE返回按扭的问题 关于从ini文件里读写数据的问题 急需delphi4.0和vb4.0,要分/rmb均可 要一个思路,如何实际提醒 文件拷贝问题,急!!! 问: 怎样在编写动态连接库中添加Initialization和Finalization啊??(苦苦哀求)
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls; type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
btnTestSockets: TButton;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnTestSocketsClick(Sender: TObject);
private
FStream: TFileStream;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
FStream := nil;
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end; procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite));
end; procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
ServerSocket1.Active := True;
ClientSocket1.Active := True;
end; end.
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
linkcmd:string;
Mybmp: Tbitmap;
MyStream: TMemoryStream; //采集数据流
MyJpg:Tjpegimage;
begin
linkcmd:=Socket.ReceiveText;
if linkcmd='传送图像' then ;
begin
MyStream := TMemoryStream.Create;
try
MyJpg:=Tjpegimage.Create;
Mybmp := TBitmap.Create;
GetScreen(mybmp); //--获取 mybmp 图像
Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
MyStream.Clear;
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
Myjpg.free;
MyStream.Position := 0
Socket.SendStream(mystream);
finally
MyBmp.free;
mystream.Free;
end;
end;
end;-----------------client------------------------
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
mystream:TMemorystream;
myjpg:tjpegimage;
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
MyStream.Position := 0;
try
Socket.ReceiveBuf(Bfr^, iLen);
mystream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
myjpg:=Tjpegimage.Create;
myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
image1.Picture.Assign(myjpg); //--将收到的图像显示出来
image1.Free;
mystream.Free;
end;
myjpg.LoadFromStream(MyStream);
image1.Picture.Assign(myjpg); //--将收到的图像显示出来
已能将流的内容正确保存为图片,但到 client 无法接收到正确的数据,怀凝是图片太大(100-200KB)那位能够给一段把流分段传送的代码。
const
MP_Read='1'; //--准备发送数据
MP_Info='2'; //--发送的数据信息
Mp_Data='3'; //--发送数据
----------Server----------------
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
linkcmd:string;
Mybmp: Tbitmap;
//Buf:pointer;
buf:array[1..8192] of byte;
sendsize: integer; //每次发送的大小
bufsize:integer;begin
linkcmd:=trim(Socket.ReceiveText);
case linkcmd[1] of
MP_Read:
begin
MyStream := TMemoryStream.Create;
MyJpg:=Tjpegimage.Create;
Mybmp := TBitmap.Create;
GetScreen(mybmp);
//bmpmap.PixelFormat :=pf8bit; //监看颜色降至为256色
Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
image1.Picture.Assign(myjpg); //--显示取得的图
//image1.Picture.Bitmap.Assign(mybmp);
MyStream.Clear;
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
Myjpg.free;
Jpgsize:=mystream.Size;
socket.SendText(Mp_Info+inttostr(jpgsize));
mystream.SaveToFile('c:\temp\55.jpg');
mystream.Position:=0;
edit2.Text:=inttostr(jpgsize);
fssize:=0; //--传送字节数置0
MyBmp.free;
end;
MP_Data:
begin
bufsize:=sizeof(buf);
if JpgSize > BufSize then
SendSize := BufSize
else
SendSize := JpgSize;
mystream.ReadBuffer(Buf, SendSize);
JpgSize := JpgSize - SendSize;
fssize:=fssize+sendsize;
edit3.Text :=inttostr(fssize);
if JpgSize = 0 then
begin
MyStream.Clear; { 清空流 }
MyStream.Free;
end;
socket.SendBuf(buf,SendSize); { 将数据发到主控机 }
end;
end;
end;
----------Client----------------
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
myjpg:tjpegimage;
ilen:integer;
buf:array[1..8192] of byte ;
BufSize:integer;
scmd:string;
begin
if bReadText then
begin
scmd:=socket.ReceiveText;
if scmd[1]=MP_Info then
begin
ilen:=length(scmd);
jpgsize:=strtoint(copy(scmd,2,ilen-1));
edit3.Text:=inttostr(jpgsize); //--显示所接收的总字节数
mystream:=TMemorystream.Create;
mystream.clear;
socket.SendText(Mp_Data);
bReadText:=false;
end;
end
else
begin
BufSize:=sizeof(buf);
if jpgsize > BufSize then
RecSize := BufSize
else
RecSize := jpgsize;
socket.ReceiveBuf(buf, RecSize);
jpgSize := jpgSize - RecSize;
edit4.Text:=inttostr(jpgsize); //--显示还剩余的字节数
mystream.WriteBuffer(buf,recsize);
if jpgsize = 0 then //读完数据
begin
mystream.Position := 0;
myjpg:=Tjpegimage.Create;
myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
image1.Picture.Assign(myjpg); //--显示图片
mystream.SaveToFile('c:\temp\555.jpg'); //--将收到的图片临时保存
end
else
socket.SendText(MP_data);
end;
end;