Video-Frame als BMP speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

Wenn Du das Video mit PlayMovie abspielst kannst Du die Frames direkt aus dem DirectShow Buffer grabben.

Hier ein Beispiel von Fr34k, das ich für PB4.20 angepasst habe:

Code: Alles auswählen

; ---------------------------------------------------------------------
;
; CaptureFrame(#Movie, #Image, #Memory)
;
; Copies the current frame of the #Movie to the #Image.
; The movie must pe paused when calling this, otherwise it will fail.
; The #Image should be the same size as the movie (MovieWidth(), MovieHeight())
; You must provide an unused memory bank number for temporary storage.
;
; ---------------------------------------------------------------------

Structure PB_StructureMovie
  Movie.IGraphBuilder
  MediaControl.IMediaControl
  MediaEvent.IMediaEventEx
  Window.IVideoWindow
  Audio.IBasicAudio
  Video.IBasicVideo
  MediaSeeking.IMediaSeeking
  state.l ; State of the Movie
EndStructure 

Procedure.l CaptureFrame(MovieNumber, ImageNumber)
  Protected *Movie.PB_StructureMovie, *Video.IBasicVideo, *Window.IVideoWindow
  Protected *ImageData.BITMAPINFOHEADER, DataSize, Parent, Result
  
  *Movie  = IsMovie(MovieNumber) 
  *Movie  + MovieNumber * SizeOf(PB_StructureMovie)
  *Window = *Movie\Window
  *Video  = *Movie\Video
  
  Result  = 0
  
  If *Video\GetCurrentImage(@DataSize, 0) = #S_OK
    
    *ImageData = AllocateMemory(DataSize)
    If *ImageData
      
      If *Video\GetCurrentImage(@DataSize, *ImageData) = #S_OK
        
        If IsImage( ImageNumber )
          hBmp  = ImageID( ImageNumber )
          
          w = ImageWidth(ImageNumber)
          h = ImageHeight(ImageNumber)
          
          bmi.BITMAPINFO
          bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER)
          bmi\bmiHeader\biWidth  = w
          bmi\bmiHeader\biHeight = h
          bmi\bmiHeader\biPlanes = 1
          
          bmi\bmiHeader\biBitCount = ImageDepth(ImageNumber)
          bmi\bmiHeader\biBitCount = 32
          bmi\bmiHeader\biCompression = #BI_RGB
          
          hdc = StartDrawing(ImageOutput(ImageNumber))
            If hdc
              SetDIBits_( hdc, hBmp, 0, h, *ImageData, @bmi, #DIB_RGB_COLORS)
            StopDrawing()
          EndIf
        EndIf
      EndIf
      
      FreeMemory(*ImageData)
    EndIf
    
  EndIf   
  
  *Window\get_Owner(@Parent)
  RedrawWindow_(Parent,0,0,#RDW_INVALIDATE)
  ProcedureReturn Result
EndProcedure 


; ---------------------------------------------------------------------
; Code example:
; ---------------------------------------------------------------------

#Movie = 0
#Image = 0
#Memory = 0
#Window = 0

#Gadget_Capture = 0
#Gadget_Image  = 1

If InitMovie()
  FileName$ = OpenFileRequester("Choose Movie","","Movie Files|*.mpg;*.avi;*.mpeg|All Files|*.*", 0)
  
  If LoadMovie(#Movie, FileName$)
    
    Width = MovieWidth()
    Height = MovieHeight()
    
    CreateImage(#Image, Width , Height)
    
    If OpenWindow(#Window, 0, 0, Width , Height*2 + 35, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible, "Frame Capture")
      
      If CreateGadgetList(WindowID())
        
        ButtonGadget(#Gadget_Capture, (Width -100)/2, Height+5, 100, 25, "Capture Frame")
        ImageGadget(#Gadget_Image, 0, Height+35, Width, Height, UseImage(#Image))
        
        PlayMovie(#Movie, WindowID())
        
        HideWindow(#Window, 0)
        
        Repeat
          Event = WindowEvent()
          
          If Event = #PB_EventGadget And EventGadgetID() = #Gadget_Capture
            
            PauseMovie()
            
            CaptureFrame(#Movie, #Image, #Memory)
            SetGadgetState(#Gadget_Image, UseImage(#Image))                       
            
            ResumeMovie()         
            
            
          EndIf
          
          If Event = 0
            Delay(1)
          EndIf
          
        Until Event = #PB_EventCloseWindow
        
      EndIf       
      
    EndIf       
    
  EndIf
  
EndIf
"Papa, ich laufe schneller - dann ist es nicht so weit."
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

funktioniert (mit kleinen aenderungen meinerseits) einwandfrei... und konnte es auch ohne Probleme in mein Programm integrieren ...

Danke :allright:
Bild + Bild

Bild
Antworten