全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1584
推到 Plurk!
推到 Facebook!

把.avi的frame讀取出來 存檔之前把圖檔變小

尚未結案
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-29 16:42:52 IP:61.222.xxx.xxx 未訂閱
如果正常的讀取.avi的frame然後去存檔成.bmp  每張圖的大小 720*480 (一張圖有1.3M) 讀取出的frame很多張 所以存成.bmp在硬碟 很佔空間 100張就0.13G了 =.=    我自己用應用軟體去把圖縮小成360*240 (就只剩下337K) 但是這樣很麻煩 因為讀取出來的frame很多 每張這樣改 =.= 會瘋掉    不知道在讀取之後怎樣把圖直接縮小成1半 然後再存檔呢?? 原本把.avi frame讀取出來以後 直接存檔的 CODE     
 
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "vfw.h"        // for video            //    由 AVI 檔中取出影像串流    //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool GetVideoStream(char *szFile,PAVISTREAM *gapavi,AVISTREAMINFO *avis)
{
        //1 Initial the AVI library
        AVIFileInit();               //2 Open an AVI-file            HRESULT hr;
  PAVIFILE pfile;        // 讀取avi檔案
  hr = AVIFileOpen(&pfile,szFile , 0, 0L);      if (hr != 0)
  {
    return false;
  }            //3 Getting an AVI stream
        //PAVISTREAM gapavi;  // for storage the frames of AVI
                int gcpavi;        AVIFileGetStream(pfile, gapavi, 0L, 0); // 把得到的 Stream interface放在gapavi中            //4. Get the stream information
                //AVISTREAMINFO avis;
                AVICOMPRESSOPTIONS  gaAVIOptions;
                LPAVICOMPRESSOPTIONS  galpAVIOptions;                                // Stream header的資訊放在 avis中
    AVIStreamInfo(*gapavi, avis, sizeof(*avis));
    galpAVIOptions = &gaAVIOptions;
                        // 把 gaAVIOptions的內容清為0
    _fmemset(galpAVIOptions, 0, sizeof(AVICOMPRESSOPTIONS));
                        // 取出該 stream 的多媒體型態放在相對應的gaAVIOptions陣列中
    galpAVIOptions->fccType = avis->fccType;                            switch(avis->fccType) {
                                case streamtypeVIDEO:
                                         galpAVIOptions->dwFlags = AVICOMPRESSF_VALID | AVICOMPRESSF_KEYFRAMES | AVICOMPRESSF_DATARATE;
                                         galpAVIOptions->fccHandler = 0;
                                           galpAVIOptions->dwQuality = (DWORD)ICQUALITY_DEFAULT;
                                         galpAVIOptions->dwKeyFrameEvery = (DWORD)-1; // Default
                                         galpAVIOptions->dwBytesPerSecond = 0;
                                         galpAVIOptions->dwInterleaveEvery = 1;                                    break;
                                default:
                                break;
                        }
            return true;
}
//----------------------------------------------------------------------------    //-----------------------------------------------------------------------------    bool Frame2File (PAVISTREAM *gapavi,AVISTREAMINFO *avis, AnsiString fPath)
{
    PGETFRAME            gapgf; // GetFrame物件            //5. 對指定的 gapavi video stream 進行解壓縮,傳回 GetFrame物件放在gapgf中
                        if (avis->fccType == streamtypeVIDEO) {
                            gapgf = AVIStreamGetFrameOpen(*gapavi, NULL);
                                if (gapgf == NULL)
                                        return false;
                        }
    //6. 對指定的時間(2th) 計算相對應的frame
                LONG lFrameStart=AVIStreamStart(*gapavi);
    LONG lFrameLength=AVIStreamLength(*gapavi);
    Form1->Caption = String(lFrameLength);        for(int i=lFrameStart ;iHandle=hBitmap;
      Bitmap1->SaveToFile(fPath i ".bmp");
      Form1->Image1->Picture->LoadFromFile(fPath i ".bmp");
      Application->ProcessMessages();
      delete Bitmap1;        }
      return true;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   PAVISTREAM gapavi;
    AVISTREAMINFO avis;
    AnsiString sPath,sName;
    if(OpenDialog1->Execute())
    {
    // 取出 Video Stream
      GetVideoStream(OpenDialog1->FileName.c_str(),&gapavi,&avis);
      LONG lFrameLength=AVIStreamLength(gapavi);
      sName =  ExtractFileName(OpenDialog1->FileName);
      sName = ChangeFileExt(sName,"");
      sPath = String("C:\\Image\\")   sName "("  String(lFrameLength) ")";
      if (!DirectoryExists(sPath))
        CreateDir(sPath);
      sPath=sPath   String("\\");
    // 把每張圖存到資料夾裡
      Frame2File(&gapavi,&avis,sPath);
    }
}
//---------------------------------------------------------------------------
 
 
發表人 - 1666362 於 2004/10/29 17:18:49 發表人 - 1666362 於 2004/10/29 17:19:58
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-29 16:47:57 IP:61.222.xxx.xxx 未訂閱
已經把文章修正過了 我是新手 多多指教 ^^ 發表人 - 1666362 於 2004/10/29 17:21:31
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-29 23:43:20 IP:220.143.xxx.xxx 未訂閱
會員代號: 1666362 真實姓名: 王 凱偉 所在地: Taiwan 年齡: 25 Message: 1666362@pchome.com.tw //////////////////////////////////////////////////////// 修碼不如修心 新手不等於 不知道 不會 不了解 1666362 兄的修正 再此是一面好的 借鏡 很好 哈哈 哈哈哈 你的修正我在KTOP看到的一位令我驚喜的一位 C 是 m 不是 如果是(IF) 知者知之 不知情者勿問之
kilo_amd
一般會員


發表:15
回覆:13
積分:10
註冊:2003-01-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-03 23:33:37 IP:59.104.xxx.xxx 未訂閱
能寄給我一份你的這支程式碼ㄇ 最近我也在研究這個東東 謝謝
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-04 21:18:55 IP:220.133.xxx.xxx 未訂閱
也能寄給我一份你的這支程式碼ㄇ 我最近也都在搞這種東西~謝謝你ㄛ~ 我的信箱 dragonhippop@yahoo.com.tw
koopa
一般會員


發表:5
回覆:9
積分:2
註冊:2004-05-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-06 01:56:31 IP:140.118.xxx.xxx 未訂閱
縮小圖有很多相關研究。 bilinear就是其中之一,不妨以此為關鍵字搜尋一下吧。
go
一般會員


發表:0
回覆:1
積分:0
註冊:2004-11-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-23 16:10:03 IP:60.248.xxx.xxx 未訂閱
也能寄一份程式碼給我嗎? 最近也在研究這方面的東西。 信箱:hi.810200@yahoo.com.tw 多謝。
系統時間:2024-05-10 12:09:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!