screen_snip/
lib.rs

1use eframe::{egui, run_native};
2use image::buffer::ConvertBuffer;
3use image::DynamicImage;
4use xcap::Monitor;
5
6mod app;
7mod tests;
8
9use app::App;
10
11/// Captures a screenshot interactively (with region selection).
12///
13/// Will create a new fullsize window overlaying the entire screen, where the user can select a region to capture.
14///
15/// # Arguments
16///
17/// * `save_path` - A `String` that specifies the path where the screenshot will be saved.
18///
19/// # Example
20///
21/// ```
22/// use screen_snip::get_screen_snip;
23/// get_screen_snip("screenshot.png".to_string());
24/// ```
25pub fn get_screen_snip(save_path: String) {
26    let viewport_builder = egui::ViewportBuilder::default()
27        .with_title("Screenshot Viewport")
28        .with_resizable(false)
29        .with_always_on_top()
30        .with_maximized(true)
31        .with_decorations(false)
32        .with_transparent(true);
33    let options = eframe::NativeOptions {
34        viewport: viewport_builder,
35        ..Default::default()
36    };
37
38    let monitors = Monitor::all().unwrap();
39    let monitor = &monitors[0];
40    dbg!(monitor.x(), monitor.y());
41    let rgba_image = monitor.capture_image().unwrap();
42    let rgb_image = rgba_image.convert();
43    println!("Image size: {:?}", rgb_image.dimensions());
44    let factor = monitor.scale_factor();
45    println!("Scale factor: {:?}", factor);
46    let image = DynamicImage::ImageRgba8(rgb_image);
47
48    run_native(
49        "App",
50        options,
51        Box::new(|cc| Ok(Box::new(App::new(cc, image, factor, save_path)))),
52    )
53    .unwrap();
54}