- Nim library to capture desktop screen.
- Support Windows, Mac for now. PRs welcome for other platforms.
- Support multiple monitors.
- Heavily inspired by go-screenshot.
- I generally use headless version Linux so I'm not really motivated to implement X11-based screenshot on Linux. There is an example from NIM X11 package demonstrated how to make screenshot. Will consider to migrate it into our package in the future.
## Take screenshots for all monitors and merge into one png file
import screenshot
import streams
import nimPNG
let nDisplays = numActiveDisplays().int
var
height, width: int
for i in 0..<nDisplays:
let rect = getDisplayBounds(i)
if (rect.max.y - rect.min.y) > height:
height = rect.max.y - rect.min.y
width += (rect.max.x - rect.min.x)
let buffer = capture(0, 0, width, height)
var s = newFileStream("screenshot_all.png", fmWrite)
buffer.writeChunks s
s.close()
## Take screenshot for each monitor
for i in 0..<nDisplays:
let buffer = captureScreen(i)
var s = newFileStream("screenshot_" & $i & ".png", fmWrite)
buffer.writeChunks s
s.close()
- To use this library on Mac, you should enable two frameworks during
compilation. For instance, pass
-framework CoreGraphics -framework CoreFoundation
for your clang linker. Seescreenshot.nims
as reference. - The raw RGB data we retrieved from operating system normally is reversed, so we have to perform byte swap when finalizing the PNG data. But this procedure can be slow at debug mode. My Macbook Pro generally takes 3 seconds for one PNG file but once you enable the release mode, it can be really fast. (On Windows, the debug mode is not that slow though.)
- You need allow your program to have screen recording privilege if your Mac has privacy control enabled.