Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Examples & Practical Use

This chapter provides complete runnable examples showing how to integrate wgc into real applications.

Example 1: Saving Captured Frames to PNG

In this example, we capture a single frame from a selected window or monitor, save the native image to disk as native.png, and save a letterboxed version scaled to 512x512 as fitted.png.

use image::{ImageBuffer, Rgba};
use wgc::*;

fn main() -> anyhow::Result<()> {
    // 1. Prompt user to select target
    let item = new_item_with_picker(None)?;

    // 2. Initialize Wgc session
    let wgc = Wgc::new(item.clone(), Default::default())?;

    let fitted_size = FrameSize {
        width: 512,
        height: 512,
    };

    // 3. Process 1 frame
    for frame in wgc.take(1) {
        let frame = frame?;
        let native_size = frame.size()?;
        println!("Capturing target: {}", item.DisplayName()?);

        // Native size frame
        let native_pixels = frame.pixels()?;
        save_png("native.png", native_size, native_pixels)?;

        // Resolution-fitted frame (letterboxed)
        let fitted_pixels = frame.pixels_fitted(fitted_size)?;
        save_png("fitted.png", fitted_size, fitted_pixels)?;
    }

    Ok(())
}

fn save_png(path: &str, size: FrameSize, pixels: Vec<u8>) -> anyhow::Result<()> {
    let image: ImageBuffer<Rgba<u8>, Vec<u8>> =
        ImageBuffer::from_raw(size.width, size.height, pixels)
            .ok_or_else(|| anyhow::anyhow!("pixel buffer size mismatch"))?;
    image.save(path)?;
    println!("Saved image to '{path}'");
    Ok(())
}

Example 2: Displaying Captured Video in a Window

You can pair wgc with windowing and image display crates like show-image to build real-time screen viewers or streaming clients.

use show_image::{create_window, ImageInfo, ImageView};
use wgc::*;

#[show_image::main]
fn main() -> anyhow::Result<()> {
    let item = new_item_with_picker(None)?;
    let wgc = Wgc::new(item.clone(), Default::default())?;

    let title = item.DisplayName()?.to_string_lossy();
    let window = create_window(title.clone(), Default::default())?;

    for frame in wgc {
        let frame = frame?;
        let size = frame.size()?;
        let buffer = frame.pixels()?;

        let image = ImageView::new(
            ImageInfo::rgba8_premultiplied(size.width, size.height),
            &buffer,
        );
        window.set_image(title.clone(), image)?;
    }

    Ok(())
}

Example 3: Running Existing Examples from Repository

The wgc repository includes ready-to-run examples:

  • Save Image:

    cargo run --example save_image
    
  • Show Image (Real-time GUI viewer):

    cargo run --example show_image
    
  • Check System Capabilities:

    cargo run --example capabilities