; German forum: http://www.purebasic.fr/german/viewtopic.php?t=780&highlight= ; Author: Inner (improved by Falko, updated for PB 4.00 by Andre) ; Date: 08. November 2004 ; OS: Windows ; Demo: No ; Anmerkung von Falko: ; Top-Source aus dem englischen Forum, womit Bilder aus mpeg's kopiert werden können. ; Der Author dieses Source ist 'Inner' aus dem englischen Forum. Zusätzlich habe ich ; dann den einfachsten Teil (Bilder mit Zählnr. abspeichern) hinzugefügt. ; Wenn das Movie angehalten ist, kann man unten auf den Schieber klicken und grob ; vor oder zurück gehen. Mit den Cursortasten für rechts/links kann die Bildposition ; feiner abgestimmt werden. ; Auch die Bildgröße läßt sich jetzt ändern ; --------------------------------------------------------------------- ;Written by Inner from english forum at Date 25 Apr 2003 ;---------------------------- ;Falko: Erweitert, sodas man auch größere Bilder ;machen kann. Ebenso eine Pause-, und Resumefunktion jetzt vorhanden. ; ; 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.l ; IGraphBuilder DirectShow pointer MediaControl.l ; IMediaControl DirectShow pointer MediaEvent.l ; IMediaEventEx DirectShow pointer Window.l ; IVideoWindow DirectShow pointer Audio.l ; IBasicAudio DirectShow pointer Video.l ; IBasicVideo DirectShow pointer MediaSeeking.l ; IMediaSeeking DirectShow pointer State.l ; State of the movie EndStructure Procedure.l CaptureFrame(MovieNumber, ImageNumber, MemoryBank) Protected *Movie.PB_StructureMovie, *Video.IBasicVideo, *Window.IVideoWindow Protected *ImageData.BITMAPINFOHEADER, DataSize, Parent, Result !extrn _PB_Movie_ObjectsArea !mov eax, [_PB_Movie_ObjectsArea] !mov [esp+12], eax *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 Result = SetDIBits_(0, ImageID(ImageNumber), 0, *ImageData\biHeight, *ImageData+*ImageData\biSize, *ImageData, #DIB_RGB_COLORS) EndIf FreeMemory(MemoryBank) EndIf EndIf *Window\get_Owner(@Parent) RedrawWindow_(Parent,0,0,#RDW_INVALIDATE) ProcedureReturn Result EndProcedure ; --------------------------------------------------------------------- ; Code example: ; --------------------------------------------------------------------- #Movie = 0 #Image = 0 #Image2 = 1 #Memory = 0 #Window = 0 #Gadget_Capture = 0 #Gadget_Image = 1 #Gadget_Tracker = 2 #Pause=3 #Weiter=4 Path$="MovieCap\" If ExamineDirectory(0,Path$, "*.*") = 0 ; if Directory not existing? CreateDirectory(Path$) EndIf Nr=0 If InitMovie() FileName$ = OpenFileRequester("Choose Movie","","Movie Files|*.mpg;*.avi;*.mpeg|All Files|*.*", 0) If LoadMovie(#Movie, FileName$) Width = MovieWidth(#Movie) Height = MovieHeight(#Movie) Length = MovieLength(#Movie) FPS = MovieInfo(#Movie, 0) / 1000 CreateImage(#Image, Width , Height) If OpenWindow(#Window, 0, 0, Width , Height*2 + 35, "Frame Capture", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible) If CreateGadgetList(WindowID(#Window)) ButtonGadget(#Gadget_Capture,0, Height+5, 100, 25, "Capture Frame") ButtonGadget(#Pause,130, Height+5, 100, 25, "Pause Frame") ButtonGadget(#Weiter,260, Height+5, 100, 25, "Resume Frame") TrackBarGadget(#Gadget_Tracker,60,Height+30,Width-60,20,0,Length/FPS,#PB_TrackBar_Ticks) ImageGadget(#Gadget_Image, 0, Height+50, Width, Height, ImageID(#Image)) PlayMovie(#Movie, WindowID(#Window)) HideWindow(#Window, 0) Repeat Event = WindowEvent() If Event = #PB_Event_Gadget And EventGadget() = #Gadget_Capture CaptureFrame(#Movie, #Image, #Memory) Nr=Nr+1 SetGadgetState(#Gadget_Image, ImageID(#Image)) CopyImage(#Image,#Image2) ResizeImage(#Image2, 640, 480); z.B hier eine größere BMP erstellen SaveImage(#Image2,Path$+"movie"+Str(Nr)+".bmp",#PB_ImagePlugin_BMP) SetActiveGadget(#Gadget_Tracker) Event=#Gadget_Tracker EndIf If Event = #PB_Event_Gadget And EventGadget() = #Pause PauseMovie(#Movie) SetActiveGadget(#Gadget_Tracker) EndIf If Event = #PB_Event_Gadget And EventGadget() = #Weiter ResumeMovie(#Movie) SetActiveGadget(#Gadget_Tracker) EndIf If Event = #PB_Event_Gadget And EventGadget() = #Gadget_Tracker Pos.l= GetGadgetState(#Gadget_Tracker) MovieSeek(#Movie, GetGadgetState(#Gadget_Tracker)*FPS) ResumeMovie(#Movie) PauseMovie(#Movie) EndIf If Event = 0 Delay(1) EndIf Until Event = #PB_Event_CloseWindow EndIf EndIf EndIf EndIf End ; IDE Options = PureBasic v4.02 (Windows - x86) ; Folding = -