远程控制篇:抓取远程屏幕图像
{抓屏幕图像,保存为内存流--BMP流,压缩BMP流,JPG流,以及使用流}
{在网络中传送BMP流和JPG流的速度没测试过}{BMP流的压缩是无损压缩}{ 全局变量memoryStream:TMemoryStream;memoryStream:=TMemoryStream.create;}var
image:Timage;jpgstream:TJPEGImage;ss:tcanvas;begin
ss:=tcanvas.Create;ss.Handle:=getdc(0);image:=timage.Create(self);image.width:=Screen.width;image.Height:=screen.Height ;image.picture.bitmap.PixelFormat:= pf16bit;bitblt(image.canvas.handle,0,0,image.width,image.height,ss.handle,0,0,srccopy);{大大的原始BMP流
image.picture.bitmap.SaveToStream(memoryStream);}{无损压缩BMP流 uses Zlib.pas
{先定义变量count,DestStream,SourceStream}image.picture.bitmap.SaveToStream(memoryStream);Count:=memoryStream.Size;DestStream:=TMemoryStream.Create;{压缩方式:clnone,clfastest,cldefault,clmax}SourceStream:=TCompressionStream.Create(cldefault, DestStream);trymemoryStream.SaveToStream(SourceStream);SourceStream.Free;memoryStream.Clear;memoryStream.WriteBuffer(Count, SizeOf(Count));memoryStream.CopyFrom(DestStream, 0);finallyDestStream.Free;end;}{JPG流 uses jpeg
jpgstream:= TJPEGImage.Create;jpgstream.Assign(image.picture.bitmap);jpgstream.CompressionQuality:=50; {压缩质量}jpgstream.Compress;jpgstream.SaveToStream(memoryStream);{保存为JPG流}jpgstream.free;}ReleaseDC(0,ss.Handle);
image.free;{发送内存流...}
-----------------------------------------------------
{接收内存流...}{使用BMP流
image.Picture.Bitmap.LoadFromStream(bmpStream);}{还原压缩的BMP流 uses:Zlib.pas
先定义变量count,buffer,DestStream,SourceStreammemoryStream是压缩的BMP流memoryStream.ReadBuffer(Count, SizeOf(Count));GetMem(Buffer, Count);DestStream:=TMemoryStream.Create;SourceStream:=TDecompressionStream.Create(memoryStream);TrySourceStream.ReadBuffer(Buffer^, Count); DestStream.WriteBuffer(Buffer^, Count); DestStream.Position:=0; image.Picture.Bitmap.LoadFromStream(DestStream);finallyFreeMem(Buffer);DestStream.Free;end;}使用JPG流 image.Picture.Assign(jpgstream);