- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 

Extrahera en ruta från en AVI-film Kategori: Multimedia
Inlagt: 2006-01-05
Läst: 1398
Inlagt av: Staffan Berg
Beskrivning
Detta exempel plockar ut tre rutor (frames) från en AVI-film.
Kod
uses 
VfW //from download  
 
function GrabAVIFrame(avifn: string ; iFrameNumber: Integer; ToFileName: TFileName): Boolean; 
var 
 Error: Integer; 
 pFile: PAVIFile; 
 AVIStream: PAVIStream; 
 gapgf: PGETFRAME; 
 lpbi: PBITMAPINFOHEADER; 
 bits: PChar; 
 hBmp: HBITMAP; 
 AviInfo: TAVIFILEINFOW; 
 sError: string ; 
 TmpBmp: TBitmap; 
 DC_Handle: HDC; 
begin 
 Result := False; 
 // Initialize the AVIFile library. 
 AVIFileInit; 
 
 // The AVIFileOpen function opens an AVI file 
 Error := AVIFileOpen(pFile, PChar(avifn), 0, nil); 
 if Error <> 0 then 
 begin 
  AVIFileExit; 
  case Error of 
   AVIERR_BADFORMAT: sError := 'The file couldn''t be read'; 
   AVIERR_MEMORY: sError := 'The file could not be opened because of insufficient memory.'; 
   AVIERR_FILEREAD: sError := 'A disk error occurred while reading the file.'; 
   AVIERR_FILEOPEN: sError := 'A disk error occurred while opening the file.'; 
  end; 
  ShowMessage(sError); 
  Exit; 
 end; 
 
 // AVIFileInfo obtains information about an AVI file 
 if AVIFileInfo(pFile, @AVIINFO, SizeOf(AVIINFO)) <> AVIERR_OK then 
 begin 
  // Clean up and exit 
  AVIFileRelease(pFile); 
  AVIFileExit; 
  Exit; 
 end; 
 
 // Show some information about the AVI 
 Form1.Memo1.Lines.Add('AVI Width : ' + IntToStr(AVIINFO.dwWidth)); 
 Form1.Memo1.Lines.Add('AVI Height : ' + IntToStr(AVIINFO.dwHeight)); 
 Form1.Memo1.Lines.Add('AVI Length : ' + IntToStr(AVIINFO.dwLength)); 
 
 // Open a Stream from the file 
 Error := AVIFileGetStream(pFile, AVIStream, streamtypeVIDEO, 0); 
 if Error <> AVIERR_OK then 
 begin 
  // Clean up and exit 
  AVIFileRelease(pFile); 
  AVIFileExit; 
  Exit; 
 end; 
 
 // Prepares to decompress video frames 
 gapgf := AVIStreamGetFrameOpen(AVIStream, nil); 
 if gapgf = nil then 
 begin 
  AVIStreamRelease(AVIStream); 
  AVIFileRelease(pFile); 
  AVIFileExit; 
  Exit; 
 end; 
 
 // Read current Frame 
 // AVIStreamGetFrame Returns the address of a decompressed video frame 
 lpbi := AVIStreamGetFrame(gapgf, iFrameNumber); 
 if lpbi = nil then 
 begin 
  AVIStreamGetFrameClose(gapgf); 
  AVIStreamRelease(AVIStream); 
  AVIFileRelease(pFile); 
  AVIFileExit; 
  Exit; 
 end; 
 
 // Show number of frames: 
 Form1.Memo1.Lines.Add(Format('Framstart: %d FrameEnd: %d', 
  [AVIStreamStart(AVIStream), AVIStreamEnd(AVIStream)])); 
 
 TmpBmp := TBitmap.Create; 
 try 
  TmpBmp.Height := lpbi.biHeight; 
  TmpBmp.Width := lpbi.biWidth; 
  bits := Pointer(Integer(lpbi) + SizeOf(TBITMAPINFOHEADER)); 
 
  DC_Handle := CreateDC('Display', nil, nil, nil); 
  try 
   hBmp := CreateDIBitmap(DC_Handle, // handle of device context 
    lpbi^, // address of bitmap size and format data 
    CBM_INIT, // initialization flag 
    bits, // address of initialization data 
    PBITMAPINFO(lpbi)^, // address of bitmap color-format data 
    DIB_RGB_COLORS); // color-data usage 
  finally 
   DeleteDC(DC_Handle); 
  end; 
 
  TmpBmp.Handle := hBmp; 
  AVIStreamGetFrameClose(gapgf); 
  AVIStreamRelease(AVIStream); 
  AVIFileRelease(pfile); 
  AVIFileExit; 
  try 
   TmpBmp.SaveToFile(ToFileName); 
   Result := True; 
  except 
  end; 
 finally 
  TmpBmp.Free; 
 end; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
 // Extract Frame 3 from AVI file 
 GrabAVIFrame('C:\Test.avi', 3, 'c:\avifram.bmp'); 
end; 

 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -