Skip to content

Capture Guide ​

Screen capture for DCC applications.

Overview ​

The capture module provides GPU framebuffer screenshot and frame capture functionality for DCC applications. It supports multiple backends depending on the platform:

  • Windows — DXGI Desktop Duplication API
  • Linux — X11 XShmGetImage
  • All platforms — Mock backend (synthetic checkerboard for testing / CI)

TIP

The capturer automatically selects the best available backend on the current platform. Use Capturer.new_mock() in headless CI environments.

Quick Start ​

Capturing a Frame ​

python
from dcc_mcp_core import Capturer

# Create capturer with best available backend
capturer = Capturer.new_auto()

# Capture a frame (default: PNG format)
frame = capturer.capture()

# Save to file
with open("screenshot.png", "wb") as f:
    f.write(frame.data)

print(f"Captured {frame.width}x{frame.height}, {frame.byte_len()} bytes")
print(f"Format: {frame.format}")  # "png", "jpeg", or "raw_bgra"
print(f"Backend: {capturer.backend_name()}")

Capturing by Process ID or Window Title ​

python
# Capture a window by process ID
frame = capturer.capture(process_id=1234)

# Capture a window by title substring
frame = capturer.capture(window_title="Maya")

Mock Capturer (Headless / CI) ​

python
from dcc_mcp_core import Capturer

# Synthetic backend — always available, no GPU required
capturer = Capturer.new_mock(width=1920, height=1080)
frame = capturer.capture(format="raw_bgra")
print(f"{frame.width}x{frame.height}")

CaptureFrame ​

Returned by Capturer.capture(). Contains the captured image data and metadata.

Properties ​

PropertyTypeDescription
databytesEncoded image bytes (PNG/JPEG) or raw BGRA32
widthintFrame width in pixels
heightintFrame height in pixels
formatstr"png", "jpeg", or "raw_bgra"
mime_typestrMIME type, e.g. "image/png"
timestamp_msintUnix timestamp in ms at capture time
dpi_scalefloatDisplay scale factor (1.0 standard, 2.0 HiDPI)

Methods ​

MethodReturnsDescription
byte_len()intByte length of the encoded image data

Example ​

python
capturer = Capturer.new_auto()
frame = capturer.capture(format="png")

print(f"Size: {frame.width}x{frame.height}")
print(f"Format: {frame.format} ({frame.mime_type})")
print(f"Bytes: {frame.byte_len()}")
print(f"DPI scale: {frame.dpi_scale}")
print(f"Captured at: {frame.timestamp_ms}")

# Write PNG to disk
with open("viewport.png", "wb") as f:
    f.write(frame.data)

Capture Formats ​

PNG (Lossless) ​

Best quality, larger file size. Default format.

python
frame = capturer.capture(format="png")

JPEG (Lossy) ​

Smaller file size, some quality loss. Adjust quality with jpeg_quality:

python
frame = capturer.capture(format="jpeg", jpeg_quality=90)

Raw BGRA ​

Raw pixel data for processing. No encoding overhead.

python
frame = capturer.capture(format="raw_bgra")
# frame.data contains raw BGRA32 bytes
print(f"Size: {frame.width * frame.height * 4} bytes")

Capture Parameters ​

scale ​

Scale factor 0.0–1.0. Reduces resolution for faster capture:

python
# Half resolution
frame = capturer.capture(scale=0.5)

timeout_ms ​

Maximum wait time in milliseconds:

python
# 10 second timeout
frame = capturer.capture(timeout_ms=10000)

process_id / window_title ​

Target a specific window:

python
# By process ID
frame = capturer.capture(process_id=os.getpid())

# By window title (partial match)
frame = capturer.capture(window_title="Maya")

Statistics ​

python
capturer = Capturer.new_auto()

# ... do some captures ...

count, total_bytes, errors = capturer.stats()
print(f"Capture count: {count}")
print(f"Total bytes: {total_bytes}")
print(f"Errors: {errors}")
print(f"Backend: {capturer.backend_name()}")

Backend Selection ​

new_auto() probes backends in priority order:

PriorityWindowsLinuxmacOS
1DXGI Desktop DuplicationX11 (if DISPLAY set)Mock
2MockMock—

Manual Mock (CI / Headless) ​

python
# Always safe in CI or headless environments
capturer = Capturer.new_mock(width=1280, height=720)

Error Handling ​

Capture raises RuntimeError on failure:

python
from dcc_mcp_core import Capturer

capturer = Capturer.new_auto()

try:
    frame = capturer.capture(process_id=99999)  # Non-existent PID
except RuntimeError as e:
    print(f"Capture failed: {e}")
    # Handle error (window not found, backend unavailable, etc.)

Platform Notes ​

Windows ​

  • Requires Windows 8 or later
  • Desktop Duplication must be enabled
  • DXGI backend provides GPU framebuffer access (<16ms per frame)
  • May require running as administrator for some windows

Linux ​

  • Requires X11 display server (DISPLAY env var)
  • X11 XShmGetImage backend
  • Wayland support is planned

macOS ​

  • Uses Mock backend for testing
  • Production capture requires platform-specific implementation

Performance Tips ​

  1. Use appropriate formats — PNG for quality, JPEG for speed, raw_bgra for processing
  2. Target specific windows — Avoid full-screen capture when possible
  3. Use lower scale for thumbnails/previews
  4. Mock backend in CI — No GPU required, deterministic output

Released under the MIT License.