我在Delphi5中我需要1秒钟抓屏至少7次,然后通过Picture显示出来!怎样解决?提供思路者50大洋奉上!提供源代码者200大洋奉上!先来50大洋!(50

  • 主题发起人 主题发起人 wanxu
  • 开始时间 开始时间
llfirst:我去看了,全是英文,到底在哪个地方可以下载源代码?我想要Delohi5的源代码!
 
看看这里吧,满足你的要求,如果可以用的话就给分吧。

http://www.delphibbs.com/delphibbs/dispq.asp?LID=538683
 
VNS效果也不怎么样的.
我的一个朋友,就是做了一个"网络公牛"的那个.
上个星期去他那里玩,原来他是用动态检测显存变化的.很稳定.
他连续运行了一个星期都没有出错.
主要是那个线称部分要做好.多开一个线程检测有没有死掉,停滞不前立刻KILL掉一个.
他没有用到DIRCETX.他说,他不知道那是什么.说准备买本书看看.估计改用DIRCTEX后速度
会更加快.
 
哈哈哈哈,大家继续讨论!!我想这个题目已经超出了他本身的的价值了!
我希望哪位朋友能够提出一个大概的思路!是基于客户端和服务器端的!
 
to jingtao:
不用Directx如何检测“显存变化”?
 
呵呵,sorry,刚从他那里回来。
原来我听错了。
 
屏幕回传的功能,其根本的原理是先捕获屏幕画面,然后回传给客户机,
由于画面的数据量很大所以,很多程序都是在画面改变的时候才回传改
变部分的画面,常用的手段是最小矩形法,下面以一段算法举例:

#define MAXXCount 10 //屏幕X方向最多分割块数
#define MAXYCount 5 //... Y................
#define DestNum 1000 //每块的偏移检测点最大个数
COLORREF Colors[MAXXCount][MAXYCount][DestNum];
COLORREF BakColors[MAXXCount]{MAXYCount][DestNum];
TPoint Dests[DestNum];
int Sw;
int Sh;
int xCount;
int yCount;
int ItemWidth;
int ItemHeight;
int Dnum;
int Qlity;
//得到消息后执行:
//另外:接收到的数据包中分析出 Dnum ,Qlity
//Dnum:偏移观测点数量
//Qlity:图象要求质量
__fastcall TForm1::CopyScreen(int DNum,int Qlity){
ItemWidth=Sw/xCount;
ItemHeight=Sh/yCount;
Sw=Screen->Width;
Sh=Screen->Height;
xCount=(Sw>1000)?8:6;
yCount=(Sh>1000)?3:2;
for (int num1=0;num1 Dests[num1].x=random(ItemWidth);
Dests[num1].y=random(ItemHeight);
}
CatchScreen(DNum,Qlity);
}
//收到刷屏消息后只执行:
CatchScreen(DNum,Qlity);
__fastcall TForm1::CatchScreen(int DNum,int Qlity){
//函数功能:扫描改变的屏幕区域,并切经过优化处理,最后发送这些区域数据
//DNum: 偏移量 Qlity:图象质量
HDC dc=GetDC(GetDesktopWindow());
Graphics::TBitmap *bm=new Graphics::TBitmap;
bm->Width=Sw;
bm->Height=Sh;
BitBlt(bm->Canvas->Handle,0,0,Sw-1,Sh-1,dc,0,0);
int num1,num2,num3;
int nowx,nowy;
bool Change;
bool ItemChange[MAXXCount][MAXYCount];
for (num1=0;num1 nowx=ItemWidth*num1;
for (num2=0;num2 nowy=ItemHeight*num2;
Change=false;
for (num3=0;num3 Colors[num1][num2][num3]=bm->Canvas->Pixels[nowx+Dests[num3].x][nowy+Dests[num3].y];
if (Colors[num1][num2][num3]!=BakColors[num1][num2][num3]){
BakColors[num1][num2][num3]=Colors[num1][num2][num3];
ItemChange[num1][num2]=true;
}
}
}
}

int CNum,MaxCNum;
int ChangedNum=0;
TRect *Rect;
int num4;
int MinSize=10000;
int m;
TRect MinRect;
Graphics::TBitmap *bt2=new Graphics::TBitmap;
TJPEGImage *j=new TJPEGImage;
//************************
j->Quality=Qlity;
//************************
CopyScreenUint CopyScreen;
CopyScreenItemUint CopyScreenItem;
TMemoryStream *ms=new TMemoryStream;
ms->Write(&TcpMsg,sizeof(TcpMsgUint));
ms->Write(&CopyScreen,sizeof(CopyScreenUint));
do{
for (num1=0;num1 for (num2=0;num2 for (num3=num1+1;num3<=xCount;num3++){
MaxCNum=0;
for (num4=num2+1;num4<=yCount;num4++){ //遍历所有矩形
CNum=GetChangedNum(TRect(num1,num2,num3,num4));
if (CNum>MaxCNum) MaxCNum=CNum;
m=(num3-num1)*(num4-num2);
if (2*m-CNum MinSize=2*m-CNum;
MinRect=TRect(num1,num2,num3,num4);
}
}
}
TMemoryStream *ms;
BitBlt(bt2->Canvas->Handle,0,0,ItemWidth-1,ItemHeight-1,bt->Canvas->Handle,0,0);
j->Assign(bt2);
j->SaveToStream(ms2);
CopyScreenItem.Rect=TRect(num1,num2,num3,num4);
CopyScreenItem.FileType=JPEGFILE;
//JPEGFILE 定义为:#define JPEGFILE 1
ms2->Position=0;
CopyScreenItem.Length=ms2->Size;
ms->Write(&amp;CopyScreenItem,sizeof(ScreenItemUint));
ms->CopyFrom(ms2,ms2->Size);
ChangedNum++;
}while(MaxCNum>0);
TcpMsg.Type=MsgCopyScreen;
ms->Position=0;
TcpMsg.Length=ms->Size-sizeof(TcpMsgUint);
CopyScreen.Count=ChangedNum;
ms->Write(&amp;TcpMsg,sizeof(TcpMsgUint));
ms->Write(&amp;CopyScreen,sizeof(CopyScreenUInt));
ms->Position=0;
sock->SendStream(ms);
}

  这个程序把屏幕画面切分为了多个部分,并存储画面为JPG格式,这样压缩率就变的
十分的高了。通过这种方法压缩处理过的数据,变得十分小,甚至在屏幕没有改变的情况
下,传送的数据量为0,在这里不做过多分析了,有兴趣的朋友,可以多看看。
 
procedure TForm1.TimerTimer(Sender:TObject);
var
Fullscreen:Tbitmap;
FullscreenCanas:TCanvas;
dc:HDC;
begin

timer1.Enabled:=false;
Fullscreen:TBitmap.Create;
Fullscreen.Width:=screen.width;
Fullscreen.Height:=screen.Height;
DC:=GetDC(0);
FullscreenCanvas:=TCanvas.Create;
FullscreenCanvas:=DC;
Fullscreen.Canvas.CopyRect
(Rect(0,0,screen.Width,screen.Height),fullscreenCanvas,
Rect(0,0,Screen.Width,Screen.Height));
FullscreenCanvas.Free;
ReleaseDC(0,DC);
image1.picture.Bitmap:=fullscreen;
image1.Width:=fullscreen.Width;
image1.Height:=fullscreen.Height;
fullscreen.free;
form1.show;
end;
 
[blue]关注!嗯,把它提前吧![/blue]
 
http://www.delphi-jedi.org/delphigraphics/samples_section_directx.htm
看看TCapture类

Jedi有DirectShow Filter的截图、截声音的范例,我没有感觉速度有多快。
 
关键在于怎么减小网络传输的数据量上
其他的应该都不成问题。
 
我也在搞这个东西,大侠们帮帮忙啊。
 
用用WIN2000里的‘终端服务’比PCANYWHERE好的多了。
 
其实要加快数据在网络上的传输速度,除了上面的方法以外,我觉得还可以减小被传送
图片的大小,比如说我只要一个400×300的就可以了!这样就相对于原始数据流减少了
4倍!
各位朋友,不知道你们在传送图片的时候用的是什么方法?我用的是socket来
传输的,fullscreen是我抓取得图片,抓取图片后我把该图片缩小为400×300,然后我
用socket.sentbuf(fullscreen,1048576)系统报错,错误号为10022!我就搞不动了,
应该说socket.sendbuf不关心你传输的具体内容,是不是我给的缓冲区小了?有朋友
能给我答案吗?
 
这样的计算机管理工作有什么意义。
 
wanxu: 10022为参数错误!1048576 也太长了! 用socket控件一次最多发送buf的大小是8192
大于8192的会被分几次发送。而且包里还加了很多的验证机制,也就是说你传 8192 以下的包
你发多少就能正确的收多少。 可如果传8192 以上的包, 可就不是发多少,收多少了!
:) 用控件是很简单,可惜问题也不少的!
 
还有哪位高手能提供点意见???
 
多人接受答案了。
 
后退
顶部