📄 tstripmonitorthreadunit.~pas
字号:
//====================================恢复原来的像素颜色位格式
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Result:=True;
Application.ProcessMessages;//如果不进行传递则休息一会
end;
if ThePicPixFmt=5 then//=======================24位颜色==============5
begin
TheNewBmp.PixelFormat:=pf24bit;
TheOldBmp.PixelFormat:=pf24bit;
varCount:=0;
For i:=0 to TheOldBmp.Height-1 do
begin
OldP24:=TheOldBmp.ScanLine[i];//获取扫描线--old
NewP24:=TheNewBmp.ScanLine[i];//获取扫描线--New
For j:=0 to TheOldBmp.Width-1 do
begin
if OldP24^<>NewP24^ then
VarCount:=VarCount+1;
if VarCount>5 then
begin
Result:=False;
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Exit;
end;
inc(OldP24);
inc(NewP24);
end;
end;
//====================================恢复原来的像素颜色位格式
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Result:=True;
Application.ProcessMessages;//如果不进行传递则休息一会
end;
if ThePicPixFmt=6 then//======================32位颜色=============6
begin
TheNewBmp.PixelFormat:=pf24bit;
TheOldBmp.PixelFormat:=pf24bit;
varCount:=0;
For i:=0 to TheOldBmp.Height-1 do
begin
OldP24:=TheOldBmp.ScanLine[i];//获取扫描线--old
NewP24:=TheNewBmp.ScanLine[i];//获取扫描线--New
For j:=0 to TheOldBmp.Width-1 do
begin
if OldP24^<>NewP24^ then
VarCount:=VarCount+1;
if VarCount>5 then
begin
Result:=False;
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Exit;
end;
inc(OldP24);
inc(NewP24);
end;
end;
//====================================恢复原来的像素颜色位格式
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Result:=True;
Application.ProcessMessages;//如果不进行传递则休息一会
end;
if ThePicPixFmt=7 then //========================24位颜色===========7
begin
TheNewBmp.PixelFormat:=pf24bit;
TheOldBmp.PixelFormat:=pf24bit;
varCount:=0;
For i:=0 to TheOldBmp.Height-1 do
begin
OldP24:=TheOldBmp.ScanLine[i];//获取扫描线--old
NewP24:=TheNewBmp.ScanLine[i];//获取扫描线--New
For j:=0 to TheOldBmp.Width-1 do
begin
if OldP24^<>NewP24^ then
VarCount:=VarCount+1;
if VarCount>5 then
begin
Result:=False;
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Exit;
end;
inc(OldP24);
inc(NewP24);
end;
end;
//====================================恢复原来的像素颜色位格式
TheNewBmp.PixelFormat:=TheNewScrBmp.PixelFormat;
TheNewBmp.PixelFormat:=TheNewBmp.PixelFormat;
Result:=True;
Application.ProcessMessages;//如果不进行传递则休息一会
end;
end;
procedure TStripMonitorThread.Execute;
var
iNN,iMM:integer;
TheChildRect:TRect;
TheSubRect :TRect;
isDifferent :boolean;
TheSendSize :integer;
begin
Repeat//-----------------------------------------------------下一屏循环
Synchronize(GetTargetBmp); //截取屏幕特定区域的图象
iNN:=0;
//设置划分的最小传输块的矩形区域--------------TheSubRect
TheSubRect.Left :=0;
TheSubRect.Top :=0;
TheSubRect.Right :=80;
TheSubRect.Bottom :=32;
if isTheFirst then //如果是第一次传输则不必进行比较传输
begin
Repeat
iNN := iNN+1;
iMM := 0;
Repeat
iMM:=iMM+1;
TheChildRect.Left := (iMM-1)*80; //拷贝目标块的x
TheChildRect.Right := iMM*80; //拷贝目标块的底x坐标
TheChildRect.Top := (iNN-1)*32; //拷贝目标块的y
TheChildRect.Bottom := iNN*32; //拷贝目标块的底y坐标
//将目标块的图象信息拷贝到发送的目的图形中:TheVarChildBmp中
TheVarChildBmp.Canvas.CopyMode:=cmSrcCopy;
TheVarChildBmp.Canvas.CopyRect(TheSubRect,
TheNewScrBmp.Canvas,TheChildRect);
if TheImageType=0 then//是Bmp图象
TheVarChildBmp.SaveToStream(TheSendStream);
if TheImageType=1 then//是JPEG图象
begin
try
Thejpg.Assign(TheVarChildBmp);
Thejpg.CompressionQuality:=TheImageQos;
Thejpg.JPEGNeeded;
Thejpg.Compress;
TheSendStream.Size:=0;
Thejpg.SaveToStream(TheSendStream);
except
self.Terminate;
exit;
end;
end;
TheSendStream.Position:=0;
Try
TheAThread.Connection.WriteInteger(iNN);//发送坐标-------- y
TheAThread.Connection.WriteInteger(iMM);//发送坐标---------x
TheSendSize:=TheSendStream.Size;
TheAThread.Connection.WriteInteger(TheSendStream.Size);//流大小
TheAThread.Connection.WriteStream(TheSendStream);// //发送流数据
except
Self.Terminate;
exit;
end;
TheSendStream.Clear; //清除掉数据,好象是多此一举!
until (iMM*80)>=Screen.Width;
until (iNN*32)>=Screen.Height;
//将当前图象压入缓存文件便于以后比较传输
TheOldScrBmp.Canvas.Draw(0,0,TheNewScrBmp);
end;
//=============================================================比较传输
if Not isTheFirst then //如果不是第一次传输则必进行比较传输
begin
Repeat
iNN :=iNN+1;
iMM := 0;
Repeat
iMM:=iMM+1;
TheChildRect.Left := (iMM-1)*80; //拷贝目标块的x
TheChildRect.Right := iMM*80; //拷贝目标块的底x坐标
TheChildRect.Top := (iNN-1)*32; //拷贝目标块的y
TheChildRect.Bottom := iNN*32; //拷贝目标块的底y坐标
//将目标块的图象信息拷贝到发送的目的图形中:TheVarChildBmp中
TheVarChildBmp.Canvas.CopyMode:=cmSrcCopy;
TheVarChildBmp.Canvas.CopyRect(TheSubRect,
TheNewScrBmp.Canvas,TheChildRect);
TheOldChildBmp.Canvas.CopyMode:=cmSrcCopy;
TheOldChildBmp.Canvas.CopyRect(TheSubRect,
TheOldScrBmp.Canvas,TheChildRect);
//根据比较的结果判断是否进行传输
if not isSameTheBmp(TheVarChildBmp,TheOldChildBmp) then //如果有不同,则进行传输
begin
if TheImageType=0 then//是Bmp图象
TheVarChildBmp.SaveToStream(TheSendStream);
if TheImageType=1 then//是JPEG图象
begin
Thejpg.Assign(TheVarChildBmp);
Thejpg.CompressionQuality:=TheImageQos;
Thejpg.JPEGNeeded;
Thejpg.Compress;
TheSendStream.Size:=0;
Thejpg.SaveToStream(TheSendStream);
end;
TheSendStream.Position:=0;
Try
TheAThread.Connection.WriteInteger(iNN);//发送坐标-------- y
TheAThread.Connection.WriteInteger(iMM);//发送坐标---------x
TheSendSize:=TheSendStream.Size;
TheAThread.Connection.WriteInteger(TheSendStream.Size);//流大小
TheAThread.Connection.WriteStream(TheSendStream); //发送流数据
except
self.Terminate;
exit;
end;
TheSendStream.Clear; //清除掉数据,好象是多此一举!
end;
until (iMM*80)>Screen.Width;
until ((iNN*32)>=Screen.Height);
//将当前图象压入缓存文件便于以后比较传输
TheOldScrBmp.Canvas.Draw(0,0,TheNewScrBmp);
end;
isTheFirst:=False; //这个是个全局变量
until TheAThread.Connection.Connected=False; //-----------下一屏循环
end;
destructor TStripMonitorThread.Destroy;
begin
TheOldScrBmp.Free; //上次目标屏幕区域
TheNewScrBmp.Free; //当前目标屏幕区域
TheVarChildBmp.Free; //变化的子区域1..n
TheOldChildBmp.Free; //上次缓存中的变化的子区域1..n
TheSendStream.Free; //发送数据块的流释放
TheJpg.Free; //jpeg格式压缩引擎
inherited destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -