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
| Option | Type | Default | Description |
|---|---|---|---|
width | number | canvas width | Output width in pixels |
height | number | canvas height | Output height in pixels |
format | 'png' | 'jpeg' | 'png' | Image format |
quality | number | 0.9 | JPEG quality (0-1) |
transparent | boolean | false | Transparent 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 BlobVideo Options
| Option | Type | Default | Description |
|---|---|---|---|
duration | number | 5000 | Recording duration (ms) |
fps | number | 30 | Frames per second |
format | 'webm' | 'mp4' | 'webm' | Video format |
width | number | canvas width | Output width |
height | number | canvas height | Output 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>