參考BMP序列影像轉成AVI之問題 |
缺席
|
MilesWamg
一般會員 發表:18 回覆:37 積分:11 註冊:2003-02-07 發送簡訊給我 |
參考BMP序列影像轉成AVI
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33680
並將其修改成TAVIMaker物件
#pragma hdrstop #include "AVI_MAKE.h" //--------------------------------------------------------------------------- #pragma package(smart_init) __fastcall TAVIMaker::TAVIMaker() { Pic=new Graphics::TBitmap; Pic->Width=640; Pic->Height=240; } //--------------------------------------------------------- __fastcall TAVIMaker::~TAVIMaker() { } void __fastcall TAVIMaker::Set_AVI_FileName(AnsiString FileName) { AVIFileName=FileName; } void __fastcall TAVIMaker::Set_AVI_Frame_Size(int X,int Y) { Pic->Width=X; Pic->Height=Y; } void __fastcall TAVIMaker::Init_AVI() { avi = CreateAvi("test.avi",33,NULL); // 1000ms is the period between frames } void __fastcall TAVIMaker::Close_AVI() { CloseAvi(avi); } void __fastcall TAVIMaker::Add_Frame_To_AVI(HWND Handle) //2003/7/7 Miles Wang { Pic->LoadFromFile("1.bmp"); HBITMAP hbm=(HBITMAP)CopyImage(Pic->Handle,IMAGE_BITMAP,Pic->Width,Pic->Height,LR_COPYDELETEORG|LR_CREATEDIBSECTION); AddAviFrame(avi,hbm); DeleteObject(hbm); } void __fastcall TAVIMaker::Add_BMP_To_AVI() { const char *fns[] = {"1.bmp"}; HBITMAP hbm=(HBITMAP)LoadImage(NULL,fns[0],IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); AddAviFrame(avi,hbm); DeleteObject(hbm); }其中Add_Frame_To_AVI函數與Add_BMP_To_AVI() 可以得到相同的結果,但是此方法是將ccd抓取成一張bmp檔存起來再 壓成avi(如 1.bmp為一暫存檔)此一方法可行,但是如果不存於硬碟 中的話即去除硬碟儲存時間理論上會較好,基於上述,所以一影像擷取 先將其畫面存於TBitmap中來直接作壓縮動作 而小弟測試過如果將一於記憶體中的圖(非硬碟中載入,而是如copy 進來的,如下指令),則整個錄下的畫面會整個變成白色,why? Pic->Canvas->CopyRect(SourceRect,Background->Canvas,TargetRect); HBITMAP hbm=(HBITMAP)CopyImage(Pic->Handle,IMAGE_BITMAP,Pic->Width,Pic->Height,LR_COPYDELETEORG|LR_CREATEDIBSECTION); AddAviFrame(avi,hbm); DeleteObject(hbm);發表人 - taishyang 於 2003/07/13 21:37:41 |
MilesWamg
一般會員 發表:18 回覆:37 積分:11 註冊:2003-02-07 發送簡訊給我 |
修改Add_Frame_To_AVI如下
傳入Canvas->Handle,與換算出之ccd螢幕座標Shiftx,Shifty
即完成
void __fastcall TAVIMaker::Add_Frame_To_AVI(HWND Handle,int Shiftx,int Shifty) //2003/7/7 Miles Wang { TargetRect = Rect(Shiftx,Shifty ,Shiftx 640,Shifty 240); Pic->Canvas->Handle=Handle; Background->Canvas->CopyRect(SourceRect,Pic->Canvas,TargetRect); HBITMAP hbm=(HBITMAP)CopyImage(Background->Handle,IMAGE_BITMAP,Background->Width,Background->Height,LR_COPYFROMRESOURCE|LR_CREATEDIBSECTION); AddAviFrame(avi,hbm); DeleteObject(hbm); }於雙ccd攝影時可以存成單一avi 但是只有20frame/sec(640*240) 這樣算不算自問自答? 發表人 - MilesWamg 於 2003/07/13 18:43:58 發表人 - taishyang 於 2003/07/13 21:36:35 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |