avi文件-抓图

/////////////////////////////////////////////////////////////////////////////
// CAvitobmpDlg message handlers

BOOL CAvitobmpDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // TODO: Add extra initialization here
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CAvitobmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CAvitobmpDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CAvitobmpDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CAvitobmpDlg::OnButtonok() 
{
if(m_avifile==""||m_target=="")  //note fill in data first.
{
       MessageBox("PLS SELECT FILE OR FILL IN DATA FIRST!","NOTE",MB_ICONSTOP);
return;
}
      AfxGetApp()->DoWaitCursor(1);
      GetDlgItem(IDC_BUTTONOK)->EnableWindow(false);
       PAVIFILE  pfile;//Pointer  to  a  buffer  that  receives  the  new  IAVIFile  interface  pointer.                                      
           AVIFILEINFO    pfi;                          
           PAVISTREAM    pavi;                                                  
           PGETFRAME  pgf;                                                                                     
           long  length,  start; 

           //initializes  the  AVIFile  library,as AVIFileExit()。  
           //Call  AVIFileInit()  before  using  any  other  AVIFile  functions              
           AVIFileInit();  
           AVIFileOpen(&pfile,m_avifile,OF_READ  |OF_SHARE_DENY_NONE,NULL);  
             
           //obtains  information  about  an  AVI  file  
           AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO));  
           AVIFileGetStream(pfile,&pavi,streamtypeVIDEO,0);  
           length=AVIStreamLength(pavi);  
           start=AVIStreamStart(pavi); 

           AVISTREAMINFO  si;  
           AVIStreamInfo(pavi,  &si,  sizeof(si)); 

           pgf  =  AVIStreamGetFrameOpen(pavi,  NULL);  
           //GET FIRST BMP 
           LPBITMAPINFOHEADER  bmp1;  
           bmp1=  (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf,  1);  
           CClientDC  dc(this);  
          
           //DEFAUT HEAD 
           BITMAPINFOHEADER  bmih;  
           memset(&bmih,0,sizeof(BITMAPINFOHEADER));  
           bmih.biBitCount=bmp1->biBitCount;  
           bmih.biSize  =  sizeof(BITMAPINFOHEADER);  
          
          bmih.biWidth  =  pfi.dwWidth;  
          bmih.biHeight  =  pfi.dwHeight;  
          bmih.biPlanes  =bmp1->biPlanes;  //Modif By Deng Chun Ling
          
           bmih.biCompression  =BI_RGB;  
           bmih.biXPelsPerMeter  =  0;  
           bmih.biYPelsPerMeter  =  0;  
           
           BITMAPFILEHEADER  bmfh;  
       bmfh.bfSize  =  sizeof(bmfh);  
         //bmfh.bfSize=sizeof(bmp1);  //modi by deng chun ling   
       bmfh.bfOffBits  =  sizeof(bmfh)  +  sizeof(bmih); //BITMAPINFOHEADER+BITMAPINFOHEADER 
       bmfh.bfType  =  (int)'M'  *  256  +  'B';  
      // bmfh.bfType=0x424D;
       bmfh.bfReserved1  =  0;  
       bmfh.bfReserved2  =  0; 

           BYTE  *lpbuffa;  
           
           lpbuffa=new BYTE[(((pfi.dwWidth*bmih.biBitCount)+31)/8)*pfi.dwHeight];
   

           BYTE*  lpbuff;

 

   m_editqty=pfi.dwLength;
   UpdateData(false);
//Limite to 100  
//            if  (pfi.dwLength>100) pfi.dwLength=100; 
             
                    
           for(LONG  i=1;i<(LONG)pfi.dwLength;i++)  
           {  
                       lpbuff=lpbuffa;  
                       lpbuff=(BYTE  *)AVIStreamGetFrame(pgf,i);//  
                       lpbuff+=40;  
                       //TranslationDIB1(lpbuff,bmih.biWidth,bmih.biHeight,10,50);//平移function  
                       char  name1[100];  
                       strcpy(name1,m_target);//目的路徑 

                                          
                       TCHAR  name3[50];  
                       wsprintf(name3, TEXT("Bitmap%5.5ld.bmp\0"),  long(i) );  
                       strcat(name1,name3); 
                      
                                            
                       ////Write BMP File。  
                      CFile  ff(name1,  CFile::modeWrite    |  CFile::modeCreate);  //?位?  
                      ff.Write(&bmfh,  sizeof(bmfh));//bmfh-->ff  
                      ff.Write(&bmih,  40);  
                     ff.Write(lpbuff, bmp1->biSizeImage);  
                        ff.Close();  
                                   
                      Sleep(10);              
           }  
            
         

                       m_editw=i; 
                       UpdateData(false);

       //release file
       AVIStreamGetFrameClose(pgf);  
        AVIFileRelease(pfile);  
             
           //Use  the  AVIFileExit()  function  to  release  the  AVIFile  library    
           //and  decrement  the  reference  count.同AVIFileInit()??。  
           AVIFileExit();  
           ReleaseDC(&dc); 
         AfxGetApp()->DoWaitCursor(1);
MessageBox("CONVERT COMPLETED!","NOTE",MB_ICONINFORMATION);
GetDlgItem(IDC_BUTTONOK)->EnableWindow(true);          
}  
   


void CAvitobmpDlg::OnButtonabout() 
{
CAboutDlg dlg;
dlg.DoModal ();    
}

void CAvitobmpDlg::OnButtonsource() 
{

CFileDialog  FileDlg(TRUE,  "*.AVI",  NULL,    
                       OFN_HIDEREADONLY    |  OFN_OVERWRITEPROMPT,    
                       _T("AVI FILE(*.avi) |*.avi||"));  
         //  CString  m_avifile;  
           if(FileDlg.DoModal()  ==  IDOK){  
           
           m_avifile=FileDlg.GetPathName();  
           UpdateData(false);
           }
    
}

void CAvitobmpDlg::OnButtontarget() 
{
CFileDialog filedlg(FALSE,NULL,"P",NULL,("BMP File(*.bmp)|*.bmp||"));
if (filedlg.DoModal()==IDOK){

//m_target=filedlg.GetFolderPath();
m_target=filedlg.GetPathName();
m_target.MakeUpper();
UpdateData(false);

}

 

article from "UnKnow"

 

posted @ 2012-09-05 16:09  c++ player  阅读(479)  评论(0编辑  收藏  举报