線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1420
推到 Plurk!
推到 Facebook!

參考BMP序列影像轉成AVI之問題

缺席
MilesWamg
一般會員


發表:18
回覆:37
積分:11
註冊:2003-02-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-13 16:14:59 IP:163.18.xxx.xxx 未訂閱
參考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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-13 18:42:50 IP:163.18.xxx.xxx 未訂閱
修改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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-13 21:42:02 IP:140.135.xxx.xxx 未訂閱
MilesWamg您好:   
引言:這樣算不算自問自答?
但您的經驗很具有參考價值< > 順心< > ~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 - taishyang 於 2003/07/22 22:01:45
系統時間:2024-04-29 10:06:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!