如何将播放的 AVI 视频文件截取成BMP格式的文件------在线等待(60分)

  • 主题发起人 主题发起人 衣雪峰
  • 开始时间 开始时间

衣雪峰

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把一个播放着的AVI文件,随意的截取成一个个BMP文件。请问各位有什么好方法。

QQ:42057288

只有60分了,谢谢。[:(]
 
暂停播放,截取画面,继续播放。我的思路,我也没做过,呵呵
 
我已经做过一个效果比较好的播放器,只是没做过截取画面保存的功能;
不过应该不难!现在还没时间考虑;随便写,你试试,还加工一下,
myBmp := TBitMap.Create ;
MyCanvas := TCanvas.Create ;
rect := mdPlayer.DisplayRect ;
Dc := GetDc(Panel1.Handle);
myCanvas.Handle := dc;
myBmp.Width := rect.Right - rect.Left ;
myBmp.Height := rect.Bottom - rect.Top ;
myBmp.Canvas.CopyRect();
 
http://www.ysza.com 看看我得屏幕录像机,能抓到
------------------------------------
http://gezi.sms1001.com 千里挑一百万格子
http://www.haha77.com 成人笑话
http://www.dudu66.com 美图天下
http://www.sms1001.com 免费影视中心
 
话题196951的标题是: 关于Timagelist屏幕载图的问题 (200分)
分类:图形图象 jinshansxx (2000-03-09 11:15:00)
我是一个初学者,请多多关照。

liuminghao (2000-03-09 11:16:00)
用TimageList元件实现屏幕捕捉器
Timagelist元件的构造CreateSize用于创建一上图像列表并指定图像的尺寸设为与获得整个桌面的句柄,程序示例如下:
Var DeakTopCanvas:Tcanvas;屏幕一产大,程序示例如下:
imagelist1.createsize(screen.width,screen.height);

DeakTopCanvas:=TCanvas.create;
deaktopcanvas.handle:=getdc(hwnd_desktop);
Hwnd_Desktop是一个预定义的常量代表整个桌面。程序示例如下:
Var
BitMap:TBitMap;
with bitmapdo

begin

width:=screen.width;
height:=screen.height;
canvas.copyrect(canvas.cliprect,deaktopcanvas,deaktopcanvas.cliprect);
imagelist1.add(bitmap,nil);
ReleaseDC(Handle,Hwnd_DeskTop);
Free;
end;


BrushCopy, CopyRect Example
The following code illustrates the differences between CopyRect and BrushCopy. The bitmap graphic 慣ARTAN.BMP is loaded into Bitmap and displayed on the Canvas of Form1. BrushCopy replaces the color black in the graphic with the brush of the canvas, while CopyRect leaves the colors intact.
var
Bitmap: TBitmap;
MyRect, MyOther: TRect;
begin

MyRect := Rect(10,10,100,100);
MyOther := Rect(10,111,100, 201);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('c:/windows/tartan.bmp');
Form1.Canvas.BrushCopy(MyRect, Bitmap, MyRect, clBlack);
Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);
Bitmap.Free;
end;



jinshansxx (2000-03-09 11:17:00)
多谢!


liuminghao的回答最终被接受。
 
话题1114093的标题是: 谁有屏幕捕捉的源码,谢谢各位大哥了.. (50分)
分类:图形图象 tobbs (2002-05-21 12:52:00)
急啊。。。。。。。。。。。。。。

Pearl. (2002-05-21 13:01:00)
var
bmp: TBitmap;
dc: HDC;
begin

with image1.picture.bitmapdo

begin

width := screen.width;
height := screen.height;
dc := createdc('DISPLAY', nil, nil, nil);
bitblt(canvas.handle, 0, 0, width, height, dc, 0, 0, SRCCOPY);
deletedc(dc);
end;

end;

end;



tobbs (2002-05-21 13:13:00)
啊,那,捕捉 当前活动窗口 图象的源码有码?楼上的是捕捉全屏的吧。

Pearl. (2002-05-21 14:08:00)
var
dc: HDC;
h: THandle;
begin

h := getforegroundwindow;
dc := getdc(h);
.... // 同上捕捉方式
releasedc(h, dc);
end;



laohe (2002-08-09 17:47:00)
如何捕抓panel中内容;将panel存为图片

gxcooo (2002-08-09 17:51:00)
完整程序:
http://kuga.51.net/download/files/snag.zip

bigroute (2002-08-09 18:03:00)
bitblt(form1.canvas.handle, 0, 0, width, height, Getdc(0), 0, 0, SRCCOPY);
一句话搞定。

begin
Delphi (2002-08-09 22:50:00)
bitblt(form1.canvas.handle, 0, 0, width, height, Getdc(0), 0, 0, SRCCOPY);

速度快,够简单爽。

beta (2002-08-10 4:19:00)
//捕捉 当前活动窗口 图象
那还不简单,先 GetForegroundWindow 取得活动窗口句柄
然后获取其位置和大小,然后替换楼上几位所说的 BitBlt
函数中,从第二个参数开始的四个参数,即可。

bigroute (2002-08-10 13:16:00)
var ar :TRect;
begin

GetWindowRect(GetForegroundWindow ,ar);
bitblt(form1.canvas.handle, 0, 0, ar.Right -ar.Left ,ar.Bottom -ar.Top , Getdc(0), ar.Left , ar.Top, SRCCOPY);
搞定。

tobbs (2002-10-11 16:13:00)
多人接受答案了。


begin
Delphi-10,beta-5,bigroute-5,gxcooo-5,laohe-5,Pearl.-20,的回答最终被接受。
 
话题693001的标题是: 如何把Avi转成Bmp (100分)
分类:图形图象 SamuelDelphi (2001-10-27 19:43:00)
在Delphi中可以用TMediaPlayer的Step一副副的播放Avi文件到一个窗口上。我想把Avi文件的内容存成一副副的Bitmap但遇到如下问题:
1。在播放中,我无法得知Avi画面的Height与Width(TMediaPlayer的Height,Width时Player在DesignTime时的长、宽),因此无法动态的调节显示Avi的窗口的大小(即Display指向的窗口),无法“恰到好处”的显示图象。
2。显示的相应窗口(Display属性是TWinControl),没有相应的TGraphic的属性用来
Bmp := TBitmap.Create;
Bmp.Height := ...
Bmp.Width := ...
Bmp.Canvas.Draw(0, 0, 显示窗口的TGraphic属性)
Bmp.SaveToFile(....);
故我无法把其保存为Bitmap文件。
望高人指教。
SamuelDelphi@263.net

VC中有没有把Avi直接转为Bmp的控件?
Samuel0713@263.net

硬木花椒 (2001-10-27 22:27:00)
看看frame行不行?

房客 (2001-10-27 23:43:00)
B :=TBitmap.Create;
B.PixelFormat :=pf24Bit;//:)
B.Canvas.CopyRect(rect(0,0,B.Width,B.Height),XXXXX.Canvas,rect(0,0,XXXXX.Width,XXXXX.Height));
B.SaveToFile(....);


LeeChange (2001-10-30 19:14:00)
最根本的办法是用AVIStreamRead读出图象数据后再保存.

Searph (2001-10-30 19:35:00)
MSDN中有一个AVIEdit的sample,稍微改一下就能用来做AVI->BMP

yu_gao (2001-10-30 19:48:00)
csdn的delphi栏目里有一个AVI转BMP的例子,他用API读出AVI的数据一幅幅画在IMAGE上,
应该有帮助。

SSGYK (2001-12-10 12:05:00)
自已在API里找一下,很简单的。

shaofun (2002-02-27 12:49:00)
利用 VC 实现AVI文件的图像截取

[ 作者: 刘涛 添加时间: 2001-10-23 8:48:00 ]

来源:www.yesky.com

AVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF
说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,
有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。

  现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成BMP格
式的文件。笔者在使用AVI文件开发项目过程中对AVI文件的操作积累了一些经验,对于如何
实现从AVI视频流中获取任意帧的图像数据并存储成BMP文件,其中最关键的是要从AVI文件
中获取具体某一帧的图像数据,为此我利用Windows提供的API函数实现了自定义的CAvi类,
用于操作AVI文件。

  在使用API函数操作AVI文件时,一定要注意用AVIFileInit()来初始化AVI库,程序结束
时用AVIFileExit()释放AVI库,否则API函数无法使用。现以操作包含真彩色图像的AVI文件
为例,给出Cavi类的部分函数的具体实现,其中CaviCreate()函数用于读取AVI文件信息并
初始化Cavi类的成员,例如根据AVI文件信息定义每帧图像的宽、高、每帧图像的信息头结
构等等;函数AviRead(int mFrame)用于从AVI文件中读取第mFrame帧。实现代码显示如下:

//Cavi类头文件定义;
class CAvi file://AVI类,处理AVI文件
{
 public:
 int cy;//图象高
 int cx;//图象宽
 file://long m_maxFrame;
 BYTE *pData;//寸储图象数据
 BITMAPINFO *m_pBMI;//位图文件信息头
 PAVISTREAM pavi;//AVI流
 PAVIFILE pfile;//AVI文件指针
 AVIFILEINFO * pfi;
file://AVI信息
 BOOL AviRead(int mFrame);//读AVI文件的第mFrame帧
 CAvi();//标准构造函数
 CAviCreate(CString &string);//用文件名初始化AVI类的成员
 virtual ~CAvi();
};

//Cavi类文件实现部分;
CAvi::CAvi()
{ AVIFileInit();//初始化AVI库
 cx=0;//定义图象宽、高、等成员
 cy=0;
 m_pBMI=NULL;
 pData=NULL;
 file://m_maxFrame=0;
 pfi=NULL;
}
CAvi::~CAvi()//析构、释放指针
{
 // AVIFileClose(pfile);
 AVIFileExit();
 if(pData!=NULL)
  delete pData;
  pData=NULL;

 if(m_pBMI!=NULL)
  delete m_pBMI;
  m_pBMI=NULL;
  if(pfi!=NULL)
   delete pfi;
   pfi=NULL;
}
CAvi::CAviCreate(CString &string)//读文件初始化该类
{
 HRESULT hr;
 pfi=new AVIFILEINFO;
 hr = AVIFileOpen(&pfile, // returned file pointer
 string, // file name
 OF_READ, // mode to open file with
 NULL);
 hr= AVIFileInfo(pfile, file://获取AVI信息,放入pfi中
 pfi,
 sizeof(AVIFILEINFO)
);
cx=pfi->dwWidth;//图象宽、高
cy=pfi->dwHeight;
hr=AVIFileGetStream(//将AVI变成视频流
pfile,
&pavi,
streamtypeVIDEO,
0//LONG lParam
);
m_pBMI=new BITMAPINFO;//定义BMP信息头
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=cy;
m_pBMI->bmiHeader.biWidth=cx;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=cx*cy*3;
pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区
}
BOOL CAvi::AviRead(int mFrame)//将AVI文件的M帧数据读入PData缓冲区
{
HRESULT hr;
hr= AVIStreamRead( pavi,
mFrame,
1,
pData,
cx*cy*3,
NULL,
NULL
);
if(hr==0)
return TRUE;
else

return FALSE;
}



  上述Cavi类实现部分所涉及到的API函数可以参考微软提供的MSDN。Cavi类中的pData缓
冲区存放AVI文件中的具体某一帧图像数据,同时Cavi类的m_pBMI为BMP图像文件信息结构,
这时可以根据图像的大小定义BMP图像文件头结构,关于BMP文件的存储,由于篇幅的原因,
我不在多讲了,有兴趣的读者可以参见笔者的拙作"Visual C++6.0开发灰度位图处理"(天
极网软件栏目2001.9.10发表),该文里面讲述了如何存取BMP文件。以上程序在
Windows2000、Visual C++6.0环境下顺利编译通过,运行正常。


solomon19781022 (2002-02-27 15:24:00)
我也有类似的问题,不过我需要的是每帧的画面,而不能通过截屏,那位高手可以解答?

yangtsehua (2003-06-24 13:35:00)
时间太长,强制结束吧! 分拿来!:)

SSGYK (2003-06-24 14:38:00)
都2年了拿分来。

SamuelDelphi (2003-06-24 19:35:00)
多人接受答案了。


LeeChange-5,Searph-5,shaofun-5,solomon19781022-5,SSGYK-40,yangtsehua-10,yu_gao-10,房客-10,硬木花椒-10,的回答最终被接受。
 
后退
顶部