监控端: 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
在××××处,可以实现连续抓屏,但是马上溢出,那位老大看看,多谢!!!
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
在××××处,可以实现连续抓屏,但是马上溢出,那位老大看看,多谢!!!
Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
Myjpg.CompressionQuality := 20; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
Myjpg.free;然后用流的形式传输的,还有什么好的办法?多谢!!
因为这是起到监控作用的,对画质没有很高的要求。:)
还有,一副位图怎么把它缩小呀?
在网络传送的时候,还有什么比较好的压缩算法?
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;
MyJpg.Compress :=
设置得小,就可压缩比例大点啊!!在 jpeg 的基础上,再压缩的意义就不是很大了!!>>还有,一副位图怎么把它缩小呀?
简单的用就可StretchDraw
报“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!!
怎么回事?多谢!!!