捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:远程屏幕传输 (差异截图)
aizjcn 26786 2006/10/24 13:33:07
aizjcn 26712  2006-10-21 13:45:24 
垃圾代码;不知道大家看过食神没?简直就是多鱼;
bmp根据结构我们知道相同数据结构的差异只表现在结尾图片数据战位上面;
也就是说相同的屏幕图片显示不同的差异只在于相同内存流同位置的数据差异;
多鱼;多鱼是程序员的毒药;是思路狭窄的毒药;我不是什么高人只是不想见大家走弯路;
不服气的直接QQ69700122随时奉陪; 
riverqh 26714  2006-10-21 15:23:43 
呵呵,动动嘴皮,我也会说先把整个屏幕DC拷贝到内存兼容DC加Bitmap,然后GetBits取Bitmap的数据部分做比较……可是,假如真的动手呢?还有,能否考虑怎么获取系统更新的区域,这样只取更新的区域的部分就好了,不要去比较内存差异来判断图象的改变…… 

再解答一下;
你怎么去获取更新的区域?还是要运算;而且运算的复杂;
原理里上什么不同的差异怎么也和(我也会说先把整个屏幕DC拷贝到内存兼容DC加Bitmap,然后GetBits取Bitmap的数据部分做比较……)没关系吧?你TMD是不是陈月经的徒弟啊?
动不动就拿出些和真正讨论的东西无关的过程来吓唬新手是吧?
还真应证了上面朋友的话;新手看不懂;老手看半天没用的P话才知道根本不是在说前面的东西;我们的问题是在多改变区域的处理上谁有效率;

(还有,能否考虑怎么获取系统更新的区域,这样只取更新的区域的部分就好了,不要去比较内存差异来判断图象的改变…… )
答一下;我们的目的是以最少的字节传输最多的数据;
抛开运算效率不说;就区域和一个字节;你呀的就输了;你以区域为目标比较,我以字节为单位比较;谁更接近我们的目的?菜鸟都知道吧;

还有你给出的我的方式的代码又一次看出你的愚;
你的方法只是大概描述了我说的功能;你的代码太难的;用了三个指针去比较2个数据;
你猪啊?还是菜的不行了;真不知道第三个指针你是怎么想出来的;看了后郁闷了半天没搞明白怎么在累计三个指针;这就是你说的效率?

指针和区域的比较;在传输数据上区域输给指针这是肯定的;
在思路上;家里有自来水;你要跑到几公里的和尚庙去挑水喝;又是菜;
现在和尚都用自来水了;有最简单的方法你不推崇;你要让大家跟你去和尚庙挑水喝?
再退一步说;现在谁家的CPU都是G级了;只要代码优化的正确;不像你这样菜;
谁会因为自来水要花钱,跑去吃井水呢?一个字愚;都种了陈月经的圈套了;

观看陈月经的代码多了也知道了;陈月经发的代码都是在走弯路;让新手弯到老手后才大叫叫:'靠TMD陈月经;让老子多走这么多路;'

再次提醒一次;别跟着别人的思路走;要有自己的创新;陈月经说取屏幕区域差异你们就猪是的都去想办法去取屏幕区域差异;怎么就不能走出这个圈呢?
aizjcn 26784 2006/10/24 13:02:17
再点评一下;一看你就是没做过远程控制的菜鸟;
直接拿什么陈月经的代码来压人;你猪啊;用别人的东西都不知道改进一下;
第一步发送完整的原始屏幕根本就可以用其他的方法代替;
陈月经直接发送指令判断原始图象的方法;在实际中会经常出现花屏的错误;所以最好的方法是直接判断数据大小确定原始屏幕;你猪脑子居然转一次JPG;光体积上客户端就要大100K,做个P的远程控制啊;
还有;你每次获取图象的时候你就创建一次图象对象;在循环和接收中也是一样;真TMD菜;
自己在运行的时候看看内存是起伏的;每次循环都在分配是释放内存;还鸡吧说效率?猪啊?
从GetScreen到SendBuf你创建了多少个对象?释放了多少次对象?还效率呢;怎么看也不能从这么垃圾的代码上看出什么效率来;所以我说是垃圾代码;确实有实际用途需要的我留的有QQ号码;随时欢迎向学的请教;所以不算不负责;





procedure TMainGetScr.Client2Read(Sender: TObject; Socket: TCustomWinSocket);
{发送屏幕}
var
  s          : string;
  BmpStar          : TBitmap;
  BmpSend          : TBitmap;
  Myjpg          : TJpegimage;

  BmpRect          : TRect;
  bXY          : OffXY;
begin
  try
    s := Socket.ReceiveText;
    if Copy(s, 1, 3) = 'cap' then
    begin
      MyStream := TMemorystream.Create; //建立内存流
      BmpStar := TBitmap.Create;
      Myjpg := TJpegimage.Create;
      try

        GetScreen(BmpStar);
        BmpBak.Assign(BmpStar);
        BmpStar.PixelFormat := MPixBit;
        Myjpg.Assign(BmpStar);
        Myjpg.CompressionQuality := jx;
        Myjpg.SaveToStream(MyStream);

        MyStream.Position := 0;
        bXY.vSize := MyStream.Size;
        bXY.x1 := 0;
        bXY.y1 := 0;
        bXY.x2 := BmpStar.Width;
        bXY.y2 := BmpStar.Height;
        Socket.SendBuf(bXY, SizeOf(bXY));
      finally
        BmpStar.Free;
        Myjpg.Free;
      end;
    end;

    if Copy(s, 1, 3) = 'ca1' then
    begin

      BmpStar := TBitmap.Create;
      BmpSend := TBitmap.Create;
      Myjpg := TJpegimage.Create;

      try
        GetScreen(BmpStar);
        CopyBmpRect(BmpBak, BmpStar, BmpSend, BmpRect, MPixBit);
        MyStream := TMemorystream.Create;
        Myjpg.Assign(BmpSend);
        Myjpg.CompressionQuality := jx;
        Myjpg.SaveToStream(MyStream);
        MyStream.Position := 0;

        //发送基本数据
        bXY.vSize := MyStream.Size;
        bXY.x1 := BmpRect.Left;
        bXY.y1 := BmpRect.Top;
        bXY.x2 := BmpRect.Right;
        bXY.y2 := BmpRect.Bottom;

        Socket.SendBuf(bXY, SizeOf(bXY));

      finally
        BmpSend.Free;
        Myjpg.Free;
        BmpStar.Free;
      end;
    end;

    if Copy(s, 1, 4) = 'exit' then
    begin
      Client2.Close;
    end;

    if Copy(s, 1, 5) = 'ready' then
    begin
      MyStream.Position := 0;
      Socket.SendStream(MyStream);
    end;
  except

  end;

end;
aizjcn 26783 2006/10/24 12:44:24
既然你回复了;我就浪费一点时间好了;
小呀的;和我说效率里;
这么来说吧;100X100的图片;
我的说的方法去掉BMP头;8位图;((W*8 + 31) div 32 * 4)*H;我的方法要计算多少次自己算;
再给你点醒一下;不知道你有做过远程控制没?远程传输的标准你知道不?
就我来说你把所有的负担都加在客户端的行为就是愚;你的程序工作的时候;CPU占用高达98%;你自己看过没;
我的方法一半的运算在客户端;一半在服务端;
编译后看看汇编的代码;是你的有效率?睁着眼睛说瞎话吧?
不用有知道我的代码汇编后只有几行;你的代码要多少?
所以不要拿效率来压我;
一个通用标准代码的多少,运算的次数,你呀的就输了;
只看代码的过程;你的叫浪费资源;没有半点效率;
最后还要JPG;你猪啊?

我的方法你代码给了;就不重复了;
说说你的方法;

自己算要运算多少次???
function CpBMP(var B1, B2: TBitmap): TRect;
var
  i, j, k          : Integer;
  row1, row2        : pByteArray;
  BitsPerPixel      : Integer;
  firstt          : Boolean;
  x1, y1, x2, y2    : Integer;
begin

  case B1.PixelFormat of
    pf8bit: BitsPerPixel := 1;
    pf16bit: BitsPerPixel := 2;
    pf32bit: BitsPerPixel := 4;
  else
    BitsPerPixel := 4;
  end;

  firstt := true;

  x1 := 0;
  x2 := 0;
  y1 := 0;
  y2 := 0;
  for i := 0 to B1.Height - 1 do
  begin
    row1 := pByteArray(B1.Scanline[i]);
    row2 := pByteArray(B2.Scanline[i]);
    for j := 0 to B1.Width - 1 do
    begin
      for k := 0 to BitsPerPixel - 1 do
      begin
        if row1[j * BitsPerPixel + k] <> row2[j * BitsPerPixel + k] then
        begin
          if firstt then
          begin
          y1 := i;
          x1 := j;
          y2 := i;
          x2 := j;
          firstt := false;
          end
          else
          begin
          if j < x1 then
          x1 := j;
          if i > y2 then
          y2 := i;
          if j > x2 then
          x2 := j;
          end;
          Break;
        end;
      end;
    end;
  end;
  Result := Rect(x1, y1, x2, y2);
end;
procedure CopyBmpRect(var BBak, BStart, BSend: TBitmap; var VRect: TRect; PixBit: TPixelFormat = pf8bit);
var
  TmpRect          : TRect;
begin

  BBak.PixelFormat := PixBit;
  BStart.PixelFormat := PixBit;
  VRect := CpBmp(BBak, BStart);
  TmpRect.Left := 0;
  TmpRect.Top := 0;
  TmpRect.Right := VRect.Right - VRect.Left;
  TmpRect.Bottom := VRect.Bottom - VRect.Top;

  BSend.Width := TmpRect.Right;
  BSend.Height := TmpRect.Bottom;
  BSend.Canvas.CopyRect(TmpRect, BStart.Canvas, VRect);

  BBak.Assign(BStart);
end;
再加上JPG的转化的压缩;
dldengli 26780 2006/10/24 9:17:59
二,想对aizjcn说,什么食神我没有看过,更不知道多鱼是个什么玩意,也更加不理解“多鱼是程序员的毒药”是什么意思?请你在这里说话不要说些别人不懂就你懂的一些词,我们是些程序的,不是写文章的。知不知道什么是“陕西的驴子学马叫”--腔不是腔,调不是调。
dldengli 26779 2006/10/24 9:03:31
一,针对aizjcn说的,给出代码思路如下:
P1 := Stream1.Memory;
P2 := Stream2.Memory;
Stream3.SetSize(Stream1.Size);
P3 := Stream3.Memory;
for I := 0 to Stream1.Size - 1 do
begin
  if P1^ = P2^ then
    P3^ := '0'
  else
    P3^ := P2^;
  Inc(P1);
  Inc(P2);
  Inc(P3);
end;
Stream1.Clear;
Stream1.CopyFrom(Stream2,0);
数据还原则反之。可以清楚的看到如果这样的话数据传过来后还需要做:
for I := 0 to Stream1.Size - 1 do
begin
  if P3^ = '0' then
    P2^ := p1^
  else
    P2^ := P3^;
  Inc(P1);
  Inc(P2);
  Inc(P3);
end;
在效率上大打折扣。
“没有做不到的,只有想不到的”话虽然是这样说,但实际上谁又能保证想到了就能做到?都发展到这个年头了,还有什么新手和老手的分别呢?讲的就是个思路。
riverqh 26714 2006/10/21 15:23:43
呵呵,动动嘴皮,我也会说先把整个屏幕DC拷贝到内存兼容DC加Bitmap,然后GetBits取Bitmap的数据部分做比较……可是,假如真的动手呢?还有,能否考虑怎么获取系统更新的区域,这样只取更新的区域的部分就好了,不要去比较内存差异来判断图象的改变……
aizjcn 26712 2006/10/21 13:45:24
垃圾代码;不知道大家看过食神没?简直就是多鱼;
bmp根据结构我们知道相同数据结构的差异只表现在结尾图片数据战位上面;
也就是说相同的屏幕图片显示不同的差异只在于相同内存流同位置的数据差异;
多鱼;多鱼是程序员的毒药;是思路狭窄的毒药;我不是什么高人只是不想见大家走弯路;
不服气的直接QQ69700122随时奉陪;
blbz 26687 2006/10/20 1:24:14
陈经韬的东东向来保守 老实说 他能够放出来的都是那些新手看不懂、老手不屑一看破玩意破文章 
楼主如获至宝 恭喜楼主得宝
说点感言 陈作为一个老计算机专业出来的不应该只混出这么一个水平 除了让菜鸟感到他是一个高人外 说实在 也许在下资质差别 从他的东东中我吸收不到什么~~~
riverplate 26663 2006/10/19 10:01:28
很实用的代码啊,谢谢了!
hsgrass 26609 2006/10/17 8:17:00
以前觉得捉屏都很慢,学习学习,谢谢你
rwlin 26600 2006/10/16 14:59:46
谢谢分享,看看先。
dfsy 26599 2006/10/16 14:29:41
一直在想这个问题.....看看源码..谢谢啦..呵呵.
swgame 26588 2006/10/16 7:48:37
正好将要用到,谢谢您.
st52 26585 2006/10/15 22:46:58
还没看代码```不过支持你啦```
flcrack 26583 2006/10/15 20:00:46
应该可以参考灰鸽子1.2代码吧。。。
selonboy 26582 2006/10/15 13:16:43
感谢。
rongxingdelphi 26581 2006/10/15 10:54:27
顶`~~
riverqh 26579 2006/10/15 10:28:31
谢谢分享。

一直在想怎么优化这种截图的处理,譬如怎么获取系统更新的区域,怎么通过Bitblt把差异复制下来,怎么快速把bitmap压缩,后来发现自己能力有限,于是避开这些了 :(
bp_qd 26577 2006/10/15 8:41:30
看下先。学习无罪。顶!
第一页 上一页 下一页 最后页 有 59 条纪录 共3页 41 - 59
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表