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.
Fast Cross Platform Screen Capture
-
scriptmaster
- User

- Posts: 15
- Joined: Fri Mar 13, 2009 3:13 pm
- Location: Chennai, India
Fast Cross Platform Screen Capture
Last edited by scriptmaster on Sat Mar 28, 2009 8:43 pm, edited 2 times in total.
-
scriptmaster
- User

- Posts: 15
- Joined: Fri Mar 13, 2009 3:13 pm
- Location: Chennai, India
-
DarkDragon
- Addict

- Posts: 2347
- Joined: Mon Jun 02, 2003 9:16 am
- Location: Germany
- Contact:
Hello,
From the German forums ( Link )
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)
EndIfbye,
Daniel
Daniel