Page 1 of 1
Fast Cross Platform Screen Capture
Posted: Thu Mar 26, 2009 1:49 am
by scriptmaster
I was going through lots of posts in the forums for a Screen Capture code but I am able to find code that is either slow (GDI), or if it uses DirectX, it is quite unreadable/confusing, or specific to an OS (not cross-platform).
Can someone please post a Screen Capture code that is cross-platform, and fast (about 80 to 100FPS) and quite readable?
Any help is appreciated.
Thanks in advance!
Edit: Also, by Cross-Platform, I mean a "non-OS-API" way of capturing the screen, or have equivalent API for Windows, Linux and Mac and choose one of them at compile time.
Posted: Sat Mar 28, 2009 7:59 pm
by scriptmaster
*BUMP*
Anybody know a simple Screen capture code that is cross platform and produces JPEG output?
Posted: Sun Mar 29, 2009 8:33 am
by DarkDragon
Hello,
From the German forums (
Link )
Code: Select all
;Screenshots unter Windows und Linux erstellen
;Gemischt mit Danilos variante hier: http://www.purearea.net/pb/CodeArchiv/Windows_System/Screenshots/MakeWindowScreenshot.pb
; Autor: DarkDragon/Danilo ;) .
;
#SCREENSHOT_MOUSE = 2
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Procedure GetCurrentCursor(*pt.Point)
hWindow.l
dwThreadID.l
dwCurrentThreadID.l
Result = 0
If GetCursorPos_(*pt)
hWindow = WindowFromPoint_(*pt\x, *pt\y)
If IsWindow_(hWindow)
dwThreadID = GetWindowThreadProcessId_(hWindow, @nil)
dwCurrentThreadID = GetCurrentThreadId_()
If (dwCurrentThreadID <> dwThreadID)
If AttachThreadInput_(dwCurrentThreadID, dwThreadID, 1)
Result.l = GetCursor_()
AttachThreadInput_(dwCurrentThreadID, dwThreadID, 0)
EndIf
Else
Result.l = GetCursor_()
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
CompilerEndIf
Procedure MakeDesktopScreenshot(ImageNr,x,y,Width,Height,Flags)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
RunProgram("import", "-window root -crop "+Str(Width)+"x"+Str(Height)+"+"+Str(x)+"+"+Str(y)+" /tmp/snapshot.bmp", "/", 1)
hImage = LoadImage(ImageNr, "/tmp/snapshot.bmp")
CompilerElse
hImage = CreateImage(ImageNr,Width,Height)
If hImage
hDC = StartDrawing(ImageOutput())
If hDC
DeskDC = GetDC_(GetDesktopWindow_())
If DeskDC
BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
EndIf
ReleaseDC_(GetDesktopWindow_(),DeskDC)
EndIf
If (Flags & #SCREENSHOT_MOUSE)
hCursor = GetCurrentCursor(@pt.Point)
DrawImage(hCursor, pt\x-capX, pt\y-capY)
EndIf
StopDrawing()
EndIf
CompilerEndIf
ProcedureReturn hImage
EndProcedure
Procedure ViewImage()
If OpenWindow(1000, 0, 0, ImageWidth(), ImageHeight(), #PB_Window_SystemMenu, "Image")
CreateGadgetList(WindowID())
ImageGadget(1000, 0, 0, ImageWidth(), ImageHeight(), ImageID())
Repeat
Event = WaitWindowEvent()
Delay(10)
Until Event = #PB_Event_CloseWindow
CloseWindow(1000)
EndIf
EndProcedure
Delay(1000)
hImg = MakeDesktopScreenshot(0,100,300,512,256,#SCREENSHOT_MOUSE)
If hImg
ViewImage()
FreeImage(0)
EndIf