150分求“每秒抓超过7次的整屏图像到文件中(仅800*600*16M色就可以了)”(50分)

  • 主题发起人 主题发起人 wql
  • 开始时间 开始时间
同志们: 请把问题提前,谢谢!!!
 
好的,提前!!!!!!!
 
同志们: 请把问题提前,谢谢!!!


怎么感兴趣的人都到哪里去了?
 
xwings ? 你是那个老赵吗?
嘻 看到你的RlE 程序中还是我给找的Bug(见注释)[:D]。

 
我当然不是老赵啦, 这个RLE函数是我给他的,不过呢他请你改过了,然后又给我一份了. )

谢谢你啦.
 
呵呵,才看到。
(神情紧张地)GGCAT大虾不会生气吧??:)
 
to 老赵 : 呵呵 当然没有啦 多有面子咯 你说是不?
[:D][:D][:D][:D]

 
有没有人改改这个抓屏程序阿. 好像没有回应了嘛.....
 
哈哈哈!

老子好久都没有上网了,大富翁都变了一些!有点不熟悉了!

看到亲爱的xwings已把程序贴出来了!暂不论行不行否,我先实现我的承诺,请

xwings拿150分!

其他的同志也应该给他加分才对得起咱们的xwings啊!!!

本问题不结束,继续讨论吧!
 
请xwings到ID=781940拿分!
 
目前最好的CPU(2G?)显卡(GeForce 3)很多的内存(>256M),请问800*600*16bits能够抓到最多多少fps?
 
:(
我只能拿一个摄像头对着屏幕,然后把取出来的数据压缩成ASF了:(,
这样该不存在性能问题了吧??
我想实时压缩800*600*16BPP呢??
能够达到多少帧?
 
  此外,很多木马程序支持了屏幕回传的功能,其根本的原理是先捕获屏幕画面,
然后回传给客户机,由于画面的数据量很大所以,很多木马程序都是在画面改变的时
候才回传改变部分的画面,常用的手段是最小矩形法,下面以一段算法举例:


#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,在这里不做过多分析了,有兴趣的朋友,可以多看看。
 
楼上的算法原理上是好的. 不过很慢.
 
关注!
或许这就是软件实现视频广播的雏形啊!
 
各位,今天研究发现:我的程序是可以抓视频的(暂时只能抓Realplay的).
方法如下 :播放一个Real视频, 然后调整播放窗体, 让视频窗体稍稍小一点,
然后开启抓图程序, 这样就可以抓视频了. 我把抓图的大小调整为400X300 结果抓视频的速度
就可以达到35fps, 希望大家有兴趣的更深入的研究一下哦.
 
好啊!继续!
 
编译时出错:
这行:if FSurface.Lock(SurfaceDESC)=true then

错误:Incompatible types: 'TRect' and 'TDDSurfaceDesc'
我已经安装了delphiX了......
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
680
import
I
后退
顶部