⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tstripmonitorthreadunit.pas

📁 DELPHI 下远程控制源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
       end;
     end;
     //====================================恢复原来的像素颜色位格式
     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    :=TheStripHeight;
  
  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)*TheStripHeight;    //拷贝目标块的y
          TheChildRect.Bottom := iNN*TheStripHeight;        //拷贝目标块的底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*TheStripHeight)>=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)*TheStripHeight;    //拷贝目标块的y
          TheChildRect.Bottom := iNN*TheStripHeight;        //拷贝目标块的底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*TheStripHeight)>=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 + -