Skip to content

Screenshots & Video

Guide to capturing images and video from your graph visualization.

Overview

Graphty supports capturing static screenshots and animated video recordings. Use these features for sharing, documentation, or creating presentations.

Taking Screenshots

Capture the current view as an image:

typescript
const dataUrl = await graph.captureScreenshot({
  width: 1920,
  height: 1080,
  format: 'png'
});

// dataUrl is a base64 data URL
// e.g., "data:image/png;base64,iVBORw0KG..."

Screenshot Options

OptionTypeDefaultDescription
widthnumbercanvas widthOutput width in pixels
heightnumbercanvas heightOutput height in pixels
format'png' | 'jpeg''png'Image format
qualitynumber0.9JPEG quality (0-1)
transparentbooleanfalseTransparent background

Examples

typescript
// High resolution
const hiRes = await graph.captureScreenshot({
  width: 3840,
  height: 2160,
  format: 'png'
});

// Compressed JPEG
const compressed = await graph.captureScreenshot({
  format: 'jpeg',
  quality: 0.7
});

// Transparent background
const transparent = await graph.captureScreenshot({
  transparent: true,
  format: 'png'
});

Checking Capabilities

Before capturing, verify support:

typescript
const canCapture = graph.canCaptureScreenshot();
if (!canCapture) {
  console.log('Screenshot capture not supported');
}

Downloading Screenshots

Convert data URL to downloadable file:

typescript
async function downloadScreenshot() {
  const dataUrl = await graph.captureScreenshot({
    width: 1920,
    height: 1080
  });

  // Create download link
  const link = document.createElement('a');
  link.href = dataUrl;
  link.download = 'graph-screenshot.png';
  link.click();
}

Or using Blob for better memory handling:

typescript
async function downloadScreenshotBlob() {
  const dataUrl = await graph.captureScreenshot();

  // Convert to blob
  const response = await fetch(dataUrl);
  const blob = await response.blob();

  // Create download link
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = 'graph-screenshot.png';
  link.click();

  // Clean up
  URL.revokeObjectURL(url);
}

Recording Video

Capture animated video of the visualization:

typescript
const blob = await graph.captureAnimation({
  duration: 5000,     // 5 seconds
  fps: 30,            // 30 frames per second
  format: 'webm'      // Video format
});

// blob is a video Blob

Video Options

OptionTypeDefaultDescription
durationnumber5000Recording duration (ms)
fpsnumber30Frames per second
format'webm' | 'mp4''webm'Video format
widthnumbercanvas widthOutput width
heightnumbercanvas heightOutput height

Animation Capture Controls

Check if recording is in progress:

typescript
if (graph.isAnimationCapturing()) {
  console.log('Recording in progress...');
}

Cancel an ongoing recording:

typescript
graph.cancelAnimationCapture();

Downloading Video

typescript
async function recordAndDownload() {
  const blob = await graph.captureAnimation({
    duration: 10000,
    fps: 30
  });

  // Create download link
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = 'graph-animation.webm';
  link.click();

  URL.revokeObjectURL(url);
}

Creating Tours

Combine camera animation with video capture:

typescript
async function captureTour() {
  // Start at overview
  graph.zoomToFit();

  // Start recording
  const capturePromise = graph.captureAnimation({
    duration: 10000
  });

  // Animate camera during recording
  await graph.setCameraState(
    { position: { x: 100, y: 100, z: 200 }, target: { x: 0, y: 0, z: 0 } },
    { animate: true, duration: 3000 }
  );

  await graph.setCameraState(
    { position: { x: -100, y: 50, z: 150 }, target: { x: 0, y: 0, z: 0 } },
    { animate: true, duration: 3000 }
  );

  graph.zoomToFit();

  // Wait for recording to complete
  const blob = await capturePromise;

  // Download
  downloadBlob(blob, 'tour.webm');
}

function downloadBlob(blob, filename) {
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = filename;
  link.click();
  URL.revokeObjectURL(url);
}

Screenshot Button Example

Add a screenshot button to your UI:

html
<button id="screenshot-btn">Take Screenshot</button>
<graphty-element></graphty-element>

<script type="module">
  import '@graphty/graphty-element';

  document.getElementById('screenshot-btn').onclick = async () => {
    const element = document.querySelector('graphty-element');
    const graph = element.graph;

    const dataUrl = await graph.captureScreenshot({
      width: 1920,
      height: 1080
    });

    const link = document.createElement('a');
    link.href = dataUrl;
    link.download = `graph-${Date.now()}.png`;
    link.click();
  };
</script>

Recording Controls UI

html
<button id="record-btn">Record</button>
<button id="stop-btn" disabled>Stop</button>
<graphty-element></graphty-element>

<script type="module">
  import '@graphty/graphty-element';

  const recordBtn = document.getElementById('record-btn');
  const stopBtn = document.getElementById('stop-btn');
  const element = document.querySelector('graphty-element');

  let capturePromise = null;

  recordBtn.onclick = async () => {
    const graph = element.graph;

    recordBtn.disabled = true;
    stopBtn.disabled = false;

    capturePromise = graph.captureAnimation({
      duration: 30000,  // Max 30 seconds
      fps: 30
    });

    try {
      const blob = await capturePromise;
      downloadBlob(blob, 'recording.webm');
    } finally {
      recordBtn.disabled = false;
      stopBtn.disabled = true;
    }
  };

  stopBtn.onclick = () => {
    const graph = element.graph;
    graph.cancelAnimationCapture();
  };

  function downloadBlob(blob, filename) {
    const url = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.download = filename;
    link.click();
    URL.revokeObjectURL(url);
  }
</script>

Interactive Examples