Giter Site home page Giter Site logo

nashaofu / xcap Goto Github PK

View Code? Open in Web Editor NEW
412.0 7.0 49.0 2.2 MB

XCap is a cross-platform screen capture library written in Rust. It supports Linux (X11, Wayland), MacOS, and Windows. XCap supports screenshot and video recording (to be implemented).

Home Page: https://docs.rs/xcap

License: Apache License 2.0

Rust 100.00%
monitor screen-capture screencapture windows

xcap's Introduction

XCap

English | 简体中文

XCap is a cross-platform screen capture library written in Rust. It supports Linux (X11, Wayland), MacOS, and Windows. XCap supports screenshot and video recording (to be implemented).

Features

  • Cross-platform: Supports Linux (X11, Wayland), MacOS, and Windows.
  • Supports multiple screenshot modes: Can take screenshots of the screen and windows.
  • Supports video recording: Supports recording of the screen or window (to be implemented).

Implementation Status

Feature Linux(X11) Linux(Wayland) MacOS Windows
Screen Capture
Window Capture
Screen Recording 🛠️ 🛠️ 🛠️ 🛠️
Window Recording 🛠️ 🛠️ 🛠️ 🛠️
  • ✅: Feature available
  • ⛔: Feature available, but not fully supported in some special scenarios
  • 🛠️: To be developed

Examples

  • Screen Capture
use std::time::Instant;
use xcap::Monitor;

fn normalized(filename: &str) -> String {
    filename
        .replace("|", "")
        .replace("\\", "")
        .replace(":", "")
        .replace("/", "")
}

fn main() {
    let start = Instant::now();
    let monitors = Monitor::all().unwrap();

    for monitor in monitors {
        let image = monitor.capture_image().unwrap();

        image
            .save(format!("target/monitor-{}.png", normalized(monitor.name())))
            .unwrap();
    }

    println!("运行耗时: {:?}", start.elapsed());
}
  • Window Capture
use std::time::Instant;
use xcap::Window;

fn normalized(filename: &str) -> String {
    filename
        .replace("|", "")
        .replace("\\", "")
        .replace(":", "")
        .replace("/", "")
}

fn main() {
    let start = Instant::now();
    let windows = Window::all().unwrap();

    let mut i = 0;

    for window in windows {
        // 最小化的窗口不能截屏
        if window.is_minimized() {
            continue;
        }

        println!(
            "Window: {:?} {:?} {:?}",
            window.title(),
            (window.x(), window.y(), window.width(), window.height()),
            (window.is_minimized(), window.is_maximized())
        );

        let image = window.capture_image().unwrap();
        image
            .save(format!(
                "target/window-{}-{}.png",
                i,
                normalized(window.title())
            ))
            .unwrap();

        i += 1;
    }

    println!("运行耗时: {:?}", start.elapsed());
}

Linux System Requirements

On Linux, you need to install libxcb, libxrandr, and dbus.

Debian/Ubuntu:

apt-get install libxcb1 libxrandr2 libdbus-1-3

Alpine:

apk add libxcb libxrandr dbus

ArchLinux:

pacman -S libxcb libxrandr dbus

License

This project is licensed under the Apache License. See the LICENSE file for details.

xcap's People

Contributors

c-h-johnson avatar drp4rad0x avatar exbucks avatar hakxsorus avatar joshterrill avatar julianwogersien avatar lz520520 avatar mdacach avatar mokurin000 avatar nashaofu avatar olssdani avatar originalimoc avatar pylogmon avatar radoncoding avatar samrat avatar tornaxo7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

xcap's Issues

cross-compiling from linux to windows fails

error: linking with cc failed: exit status: 1
|
= note: "cc" "-m64" "/tmp/rustcwUf8e2/symbols.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.0.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.1.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.2.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.3.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.4.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.5.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.6.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.build_script_build.643d639c-cgu.7.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7.36p8dj9b6t45s9f7.rcgu.o" "-Wl,--as-needed" "-L" "/home/morgan/programming/rust/screeninfo_test/target/release/deps" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-5670385a2fe8b60b.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-fd56ba6dbf7aaecc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-b8acf8e5c2e85baa.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-1706edefffdca0a2.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-f483302e0b13708e.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-725b0718fc18e1ed.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-de685fcf2157e6fb.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-f613ac3eda05b9ff.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-3de98a7d049af6a1.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-c12183655bdce152.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-0fc7beea925de7e3.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-8c34825485bf59dc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-ba5f7e926e729d81.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-643de0950163a839.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-539ea2f72ef89687.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-871432094bb4c885.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-ef1a8ee61f2e39bf.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f1646747442c1c7b.rlib" "-Wl,--end-group" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-ff283b4bf550fa1c.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/screenshots-2a5ce0adf1b1ace7/build_script_build-2a5ce0adf1b1ace7" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs"
= note: /usr/x86_64-w64-mingw32/bin/ld: unrecognised emulation mode: elf_x86_64
Supported emulations: i386pep i386pe
collect2: error: ld returned 1 exit status

error: could not compile screenshots due to previous error
warning: build failed, waiting for other jobs to finish...
error: linking with cc failed: exit status: 1
|
= note: "cc" "-m64" "/tmp/rustcKg3gu9/symbols.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.0.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.1.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.10.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.11.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.12.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.13.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.14.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.15.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.2.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.3.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.4.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.5.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.6.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.7.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.8.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.build_script_build.35cb89b0-cgu.9.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917.49nzjwdncc56ijce.rcgu.o" "-Wl,--as-needed" "-L" "/home/morgan/programming/rust/screeninfo_test/target/release/deps" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-5670385a2fe8b60b.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-fd56ba6dbf7aaecc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-b8acf8e5c2e85baa.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-1706edefffdca0a2.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-f483302e0b13708e.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-725b0718fc18e1ed.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-de685fcf2157e6fb.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-f613ac3eda05b9ff.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-3de98a7d049af6a1.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-c12183655bdce152.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-0fc7beea925de7e3.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-8c34825485bf59dc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-ba5f7e926e729d81.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-643de0950163a839.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-539ea2f72ef89687.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-871432094bb4c885.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-ef1a8ee61f2e39bf.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f1646747442c1c7b.rlib" "-Wl,--end-group" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-ff283b4bf550fa1c.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-a00b4f76f52ef917/build_script_build-a00b4f76f52ef917" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs"
= note: /usr/x86_64-w64-mingw32/bin/ld: unrecognised emulation mode: elf_x86_64
Supported emulations: i386pep i386pe
collect2: error: ld returned 1 exit status

error: could not compile windows_x86_64_gnu due to previous error
error: linking with cc failed: exit status: 1
|
= note: "cc" "-m64" "/tmp/rustcbszz2n/symbols.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.0.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.1.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.10.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.11.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.12.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.13.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.14.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.15.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.2.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.3.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.4.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.5.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.6.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.7.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.8.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.build_script_build.8b59c8bd-cgu.9.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897.4nbrrbyk8zthh2os.rcgu.o" "-Wl,--as-needed" "-L" "/home/morgan/programming/rust/screeninfo_test/target/release/deps" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-5670385a2fe8b60b.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-fd56ba6dbf7aaecc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-b8acf8e5c2e85baa.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-1706edefffdca0a2.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-f483302e0b13708e.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-725b0718fc18e1ed.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-de685fcf2157e6fb.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-f613ac3eda05b9ff.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-3de98a7d049af6a1.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-c12183655bdce152.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-0fc7beea925de7e3.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-8c34825485bf59dc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-ba5f7e926e729d81.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-643de0950163a839.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-539ea2f72ef89687.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-871432094bb4c885.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-ef1a8ee61f2e39bf.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f1646747442c1c7b.rlib" "-Wl,--end-group" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-ff283b4bf550fa1c.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/windows_x86_64_gnu-0a7dbf4e76120897/build_script_build-0a7dbf4e76120897" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs"
= note: /usr/x86_64-w64-mingw32/bin/ld: unrecognised emulation mode: elf_x86_64
Supported emulations: i386pep i386pe
collect2: error: ld returned 1 exit status

error: could not compile windows_x86_64_gnu due to previous error
error: linking with cc failed: exit status: 1
|
= note: "cc" "-m64" "/tmp/rustcRLpQUj/symbols.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.0.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.1.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.10.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.11.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.12.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.13.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.14.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.15.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.2.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.3.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.4.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.5.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.6.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.7.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.8.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.build_script_build.89cd8602-cgu.9.rcgu.o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64.11mbwdirp3969nk9.rcgu.o" "-Wl,--as-needed" "-L" "/home/morgan/programming/rust/screeninfo_test/target/release/deps" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-5670385a2fe8b60b.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-fd56ba6dbf7aaecc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-b8acf8e5c2e85baa.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-1706edefffdca0a2.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-f483302e0b13708e.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-725b0718fc18e1ed.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-de685fcf2157e6fb.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-f613ac3eda05b9ff.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-3de98a7d049af6a1.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-c12183655bdce152.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-0fc7beea925de7e3.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-8c34825485bf59dc.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-ba5f7e926e729d81.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-643de0950163a839.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-539ea2f72ef89687.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-871432094bb4c885.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-ef1a8ee61f2e39bf.rlib" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f1646747442c1c7b.rlib" "-Wl,--end-group" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-ff283b4bf550fa1c.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/morgan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/morgan/programming/rust/screeninfo_test/target/release/build/crc32fast-ec59e83ab7b5bc64/build_script_build-ec59e83ab7b5bc64" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-nodefaultlibs"
= note: /usr/x86_64-w64-mingw32/bin/ld: unrecognised emulation mode: elf_x86_64
Supported emulations: i386pep i386pe
collect2: error: ld returned 1 exit status

error: could not compile crc32fast due to previous error

Unable to import/use Compression

Version 0.7.3 I'm unable to import the Compression enum

use screenshots::{Compression}; //unresolved reference: 'Compression'

It's just not present and fails to find it.

Image JS Buffer (Neon)

How to return vec<u8> buffer as JsBuffer ? For later use with opencv in nodejs.
And feature request to add method .js_buffer() if possible

fn take_screenshot(mut cx: FunctionContext) -> JsResult<JsBuffer> {
  let start = Instant::now();
  let screen = Screen::from_point(100, 100).unwrap();
  let image = screen.capture_area(300, 300, 300, 300).unwrap();
  let buffer = image.buffer();
  
  
  Ok(buffer)
}

console error

Panic at capture area on ubuntu gnome

Tested on Debian 12 with XFCE and worked. Now compiled same program on Ubuntu 22.04.3 LTS with GNOME and crashes with following error:

thread '<unnamed>' panicked at 'called Result::unwrap()on anErr` value: xcb protocol error

Caused by:
X(Match(RequestError { response_type: 0, error_code: 8, sequence: 1, bad_value: 951, minor_opcode: 0, major_opcode: 73, pad: 1 }), Some("x::GetImage"))', src/main.rs:58:38
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
`
at command

screen.capture_area(x,y,w,h).unwrap()

macOS screen capture error

let image = screen.capture().unwrap() results in error

Error wrong data size, expected 30882816 got 30883840

I've checked and it seems that cg_data.bytes() returns more pixels than (w * h * 4), i've tried slicing it cg_data.bytes().split_at(cg_image.width() * cg_image.height() * 4); and it works.

能截取指定窗口吗?

我正在用tauri开发一个多窗口的程序,正在找一个能解决指定窗口内可见内容的截图包,不知道你这个行不行。 如果有什么方法可以解决这个问题,不胜感激。

no method named `capture` found for struct `Vec<Screen>` in the current scope

error[E0599]: no method named capture found for struct Vec<Screen> in the current scope
--> src/main.rs:10:28
|
10 | let mut image = screen.capture().unwrap();
| ^^^^^^^ method not found in Vec<Screen>

error[E0609]: no field id on type Vec<Screen>
--> src/main.rs:12:47
|
12 | fs::write(format!("target/{}.png", screen.id.to_string()), &buffer).unwrap();
| ^^ unknown field

error[E0599]: no method named capture_area found for struct Vec<Screen> in the current scope
--> src/main.rs:14:20
|
14 | image = screen.capture_area(300, 300, 300, 300).unwrap();
| ^^^^^^^^^^^^ method not found in Vec<Screen>

error[E0609]: no field id on type Vec<Screen>
--> src/main.rs:16:49
|
16 | fs::write(format!("target/{}-2.png", screen.id.to_string()), &buffer).unwrap();
| ^^ unknown field

Some errors have detailed explanations: E0599, E0609.
For more information about an error, try rustc --explain E0599.
error: could not compile screen_shot due to 4 previous errors

Transparent png's

Hi I'm using Ubuntu 22.04 and rustc 1.67.1, when I run the example code I get transparent png's. Am I missing something?

445-2
472

您好,使用examples/下的样例代码生成的图片不是我当前桌面的图片

您好,我用您代码库中的样例代码跑成功了,在mac桌面上,但是生成的图片像是一个新桌面的图面,并不是我当前桌面的图片,我想截取我当前桌面,但是结果却很意外,并没有我想要的,我不知道哪里出了问题,但我猜测跟CGGetActiveDisplayList这个函数有关,因为它返回给我的存储在displayInfo结构体中的也是只有一个Display,所以我不知从哪里才能获取当前桌面的截图,您要是知道怎么解决,望告知,万分感谢!

MacOS下窗口截图非常慢

我不了解正常效率问题还是环境问题,有没有解决办法

基础环境:
MacOS 12.6.8
Apple Silicon
rustc 1.73.0
xcap = "0.0.5"

代码输出:

❯ ./target/debug/examples/screen         
ID:89470 截图耗时: 1.607249625s
运行耗时: 1.72181875s

代码:

use std::time::Instant;
use xcap::Window;

fn main() {
    let start = Instant::now();

    let title = "-zsh";

    let windows = Window::all().unwrap();
    for window in windows {
        if window.is_minimized() || window.title() != title {
            continue;
        }
        let start2 = Instant::now();
        let image = window.capture_image().unwrap();
        image.save("target/iTerm.png").unwrap();
        println!("ID:{} 截图耗时: {:?}", window.id(), start2.elapsed());
    }

    println!("运行耗时: {:?}", start.elapsed());
}

MacOS windows are only captured in the same screen that the program was started in.

I'm attempting to capture fullscreen application windows that may not always be visible, which becomes a problem when xcap only detects and captures windows in the desktop or the fullscreen window it was started from. I believe this can be fixed by simply using kCGWindowListOptionAll instead of kCGWindowListOptionOnScreenOnly in CGWindowListCopyWindowInfo on line 137 of impl_window.rs.

scale_factor 值获取有误

以下是我的电脑的设置
image

我发现我用这个库获取屏幕列表信息的时候的 scale_factor 仍然是 1.

以下是我使用 fltk-rs 和 此库 分别获取屏幕 xywhscale_factor 的值的测试代码和对应输出
image
image

`get_all` and `get_from_point` is not found when compiling to WASM

$ wasm-pack build --target nodejs
[INFO]: Checking for the Wasm target...
[INFO]: Compiling to Wasm...
   Compiling display-info v0.4.2
error[E0425]: cannot find function `get_all` in this scope
  --> /home/goofynugtz/.cargo/registry/src/github.com-1ecc6299db9ec823/display-info-0.4.2/src/lib.rs:32:5
   |
32 |     get_all()
   |     ^^^^^^^ not found in this scope

error[E0425]: cannot find function `get_from_point` in this scope
  --> /home/goofynugtz/.cargo/registry/src/github.com-1ecc6299db9ec823/display-info-0.4.2/src/lib.rs:36:5
   |
36 |     get_from_point(x, y)
   |     ^^^^^^^^^^^^^^ not found in this scope

For more information about this error, try `rustc --explain E0425`.
error: could not compile `display-info` due to 2 previous errors
Error: Compiling your crate to WebAssembly failed
Caused by: Compiling your crate to WebAssembly failed
Caused by: failed to execute `cargo build`: exited with exit status: 101

Error: "Get displays from point failed" on MacOS

This error happens to me when I plug in a second monitor, then arrange the displays so the second monitor appears to the left and above the primary monitor. See the image.

SECONDARY ISSUE:
The whole request fails whenever there is an issue returning results for any window in ImplWindow::all().
Instead of failing when one window is unavailable, could xcap instead proceed to return valid results for the other windows that didn't fail? Perhaps by returning a Vec<Option<Window>>

image

Cannot capture image in second screen

I run this code and being panic in Ubuntu 20.04 Wayland: called Result::unwrap() on an Err value: IoError(Custom { kind: Other, error: "Zero width not allowed" }). Here is my code:
`
use screenshots::Screen;
fn main() {
let screens = Screen::all().unwrap();

for screen in screens {
    println!("Capturing {screen:?}");
    let image = screen.capture_area(screen.display_info.x, screen.display_info.y, screen.display_info.width, screen.display_info.height).unwrap();
    image.save(format!("images/{}.png", screen.display_info.id)).unwrap();
}

}`

Panics at index out of bounds

The example code is unable to take a screenshot, panicking because of what appears to be an off-by-one error.

Relevant info:

  • OS: Artix Linux
  • Compositor: sway version 1.9-dev-88c17ece (Jan 8 2023, branch 'master')
  • screenshots-rs versions tested: 0.4.6, master

Stack trace:

thread 'main' panicked at 'index out of bounds: the len is 6220800 but the index is 6220800', src/linux/wayland_screenshot.rs:203:21
stack backtrace:
   0:     0x564cc947ad20 - std::backtrace_rs::backtrace::libunwind::trace::h1d00f3fcf4cb5ac4
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x564cc947ad20 - std::backtrace_rs::backtrace::trace_unsynchronized::h920a6ff332484ee2
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x564cc947ad20 - std::sys_common::backtrace::_print_fmt::hd7323920c925af6d
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:65:5
   3:     0x564cc947ad20 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h3155a8c966b4beb5
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:44:22
   4:     0x564cc949c4ae - core::fmt::write::h062c617411b691df
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/fmt/mod.rs:1209:17
   5:     0x564cc9478845 - std::io::Write::write_fmt::hb61fdf1275c61e1c
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/io/mod.rs:1682:15
   6:     0x564cc947aae5 - std::sys_common::backtrace::_print::hd1b4d9664ab500e0
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:47:5
   7:     0x564cc947aae5 - std::sys_common::backtrace::print::hca896ae22beb06cb
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:34:9
   8:     0x564cc947c1ef - std::panicking::default_hook::{{closure}}::h0b5eeed5cf36ab5f
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:267:22
   9:     0x564cc947bf2a - std::panicking::default_hook::h8932b573145a321b
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:286:9
  10:     0x564cc947c8e8 - std::panicking::rust_panic_with_hook::h4b1447a24e3e94f8
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:688:13
  11:     0x564cc947c687 - std::panicking::begin_panic_handler::{{closure}}::h8701da9995a3820c
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:579:13
  12:     0x564cc947b1cc - std::sys_common::backtrace::__rust_end_short_backtrace::hb696c5ed02a01598
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:137:18
  13:     0x564cc947c3a2 - rust_begin_unwind
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:575:5
  14:     0x564cc92a2733 - core::panicking::panic_fmt::h8aa706a976963c88
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/panicking.rs:65:14
  15:     0x564cc92a2882 - core::panicking::panic_bounds_check::he585f6a1f703448f
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/panicking.rs:151:5
  16:     0x564cc92b4072 - screenshots::linux::wayland_screenshot::org_freedesktop_portal_screenshot::he8b934f46abd856b
                               at /media/wahoo/Storage/git/screenshots-rs/src/linux/wayland_screenshot.rs:203:21
  17:     0x564cc92c006a - screenshots::linux::wayland_screenshot::wayland_screenshot::{{closure}}::h10434e7d389d3dc1
                               at /media/wahoo/Storage/git/screenshots-rs/src/linux/wayland_screenshot.rs:228:18
  18:     0x564cc92aec61 - core::result::Result<T,E>::or_else::h62b178b9a54a7070
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/result.rs:1446:23
  19:     0x564cc92b4c44 - screenshots::linux::wayland_screenshot::wayland_screenshot::heb7b9992d32fe15b
                               at /media/wahoo/Storage/git/screenshots-rs/src/linux/wayland_screenshot.rs:227:3
  20:     0x564cc92b68b8 - screenshots::linux::wayland::wayland_capture_screen::h0cbbb536f9147537
                               at /media/wahoo/Storage/git/screenshots-rs/src/linux/wayland.rs:9:16
  21:     0x564cc92a6008 - screenshots::linux::capture_screen::h009ff3309c86e2a8
                               at /media/wahoo/Storage/git/screenshots-rs/src/linux/mod.rs:27:5
  22:     0x564cc92a4d86 - screenshots::Screen::capture::h2a3c507383448f4c
                               at /media/wahoo/Storage/git/screenshots-rs/src/lib.rs:44:5
  23:     0x564cc92a3bea - screenshots::main::he3c7e6305c3aaf3c
                               at /media/wahoo/Storage/git/screenshots-rs/examples/screenshots.rs:10:21
  24:     0x564cc92a436b - core::ops::function::FnOnce::call_once::h63159a2998d14f8e
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/ops/function.rs:251:5
  25:     0x564cc92a31de - std::sys_common::backtrace::__rust_begin_short_backtrace::h41cef88a45362c95
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/sys_common/backtrace.rs:121:18
  26:     0x564cc92a44c1 - std::rt::lang_start::{{closure}}::h4744d1f71d41e029
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/rt.rs:166:18
  27:     0x564cc9474f9b - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h8cbb48ae40ddb046
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/core/src/ops/function.rs:286:13
  28:     0x564cc9474f9b - std::panicking::try::do_call::h92db802eb38b49b7
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:483:40
  29:     0x564cc9474f9b - std::panicking::try::ha8949d2082cf3644
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:447:19
  30:     0x564cc9474f9b - std::panic::catch_unwind::h5e34c1f8a5992ed9
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panic.rs:137:14
  31:     0x564cc9474f9b - std::rt::lang_start_internal::{{closure}}::hea52a0bb3f8ff16a
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/rt.rs:148:48
  32:     0x564cc9474f9b - std::panicking::try::do_call::h5bc358faf3d68a8b
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:483:40
  33:     0x564cc9474f9b - std::panicking::try::h675304212928379d
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panicking.rs:447:19
  34:     0x564cc9474f9b - std::panic::catch_unwind::h7ce3ad349ed5c844
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/panic.rs:137:14
  35:     0x564cc9474f9b - std::rt::lang_start_internal::hcd7e45acd25ab5ab
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/rt.rs:148:20
  36:     0x564cc92a449a - std::rt::lang_start::h98a7269b7c787ae6
                               at /rustc/90743e7298aca107ddaa0c202a4d3604e29bfeb6/library/std/src/rt.rs:165:17
  37:     0x564cc92a413e - main
  38:     0x7fc37c3cc290 - <unknown>
  39:     0x7fc37c3cc34a - __libc_start_main
  40:     0x564cc92a2bd5 - _start
                               at /build/glibc/src/glibc/csu/../sysdeps/x86_64/start.S:115
  41:                0x0 - <unknown>

Multi Monitor fullscreen screenshot error

Platform: win10
xcap version: 0.0.4

I tested with two monitors and one is fullscreen, another is not. And i can't capture the fullscreen screenshot.
I use from_point to get the monitor that i want to capture, but got wrong monitor.

0.0.3 will not compile on Linux

Steps to reproduce:

  • Running Debian
  • Trying 0.0.3 and 0.0.2
  • rustc version 1.71.0
  • Run one of the Readme examples (cargo run)

Output:

Compiling xcap v0.0.3
error[E0446]: crate-private type `ImplMonitor` in public interface
  --> /(path_redacted)/xcap-0.0.3/src/linux/capture.rs:25:1
   |
25 | pub fn capture_monitor(impl_monitor: &ImplMonitor) -> XCapResult<RgbaImage> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak crate-private type
   |
  ::: /(path_redacted)/xcap-0.0.3/src/linux/impl_monitor.rs:17:1
   |
17 | pub(crate) struct ImplMonitor {
   | ----------------------------- `ImplMonitor` declared as crate-private

Edit - upgraded rustc to 1.75.0 and it works, closing!

Why screenshot making process takes 5 seconds?

Hello, your library is a big help as I did not find anything easier to work with but I wonder what makes the process of taking a screenshot take a whole of 5 seconds? For me on MacOS m1 it takes 5 seconds.
Can this be improved?
Thanks

2008上截图是空白的

如下所示,
image

使用的参考代码是

use xcap::Monitor;
use std::time::Instant;

fn normalized(filename: &str) -> String {
    filename
        .replace("|", "")
        .replace("\\", "")
        .replace(":", "")
        .replace("/", "")
}

fn main() {
    let start = Instant::now();
    let monitors = Monitor::all().unwrap();

    for monitor in monitors {
        let image = monitor.capture_image().unwrap();

        image
            .save(format!("target/monitor-{}.png", normalized(monitor.name())))
            .unwrap();
    }

    println!("运行耗时: {:?}", start.elapsed());
}

Area size is invalid when capture from current window.

Halo, i try to capture from current active window in rust. I use active_win_pos_rs to track position from current active window and capture using capture_area, but somehow if the current window is not primary I always get error Area size is invalid. I try read screenshots-rs code to try understand the error but still don't understand fully. can you help with this?

use screenshots::{Screen, Compression};
use std::{fs};
use active_win_pos_rs::get_active_window;

#[tauri::command]
pub async fn screenshot_window(filename: &str) -> Result<(), ()> {  
  match get_active_window() {
    Ok(active_window) => {
      let mut _x: i32 = active_window.position.x as i32;
      let mut _y: i32 = active_window.position.y as i32;
      let _width: u32 = active_window.position.width as u32;
      let _height: u32 = active_window.position.height as u32;

      let screen = Screen::from_point(_x,_y).unwrap();

      let image = screen.capture_area(_x, _y, _width, _height).unwrap();
      let buffer = image.to_png(Compression::Fast).unwrap();
    },
    Err(()) => {
      println!("error occurred while getting the active window");
    }
  }

  Ok(())
}

MacOS screenshare indicator is stuck

Hi, I captured all the windows available and showed a preview to the user but for some reason the mac screenshare indicator did not go away
Screenshot 2024-01-31 at 11 33 32 AM
Is this something to do with GC where I need to release the image? Could not find such a thing in the readme

Feature: add capturing into raw BGR buffer

First of all,, thank you very much for a great work.

Is it possible to add ability to make screenshots into raw buffer rather than Result<ImageRgba> ?

it's very useful for work with opencv, but right now your lib does conversion from bgr into rgba and then to work properly with images in opencv code have to do backward conversion from rgba into bgr.

Just a side note. Result might be something like

pub struct RawImage {
    pub width: u32,
    pub height: u32,
    pub data: Vec<u8>, // even BGRA works very well in here. 
}

Then it's very easy to convert it into opencv::Mat

unsafe {
        Mat::new_rows_cols_with_data(
            image.height as i32,
            image.width as i32,
            core::CV_8UC4,
            image.data.as_mut_ptr().cast::<c_void>(),
            core::Mat_AUTO_STEP,
        )
        .unwrap()
    }

wlroots: libwayshot upgrade

libwayshot support was included in #68 on libwayshot 0.2 tag.

Since then we have had 0.3 with performance improvements and soon coming 0.x/1.x( if we finalize on stable API).
( I will make a PR including Changelog.md for libwayshot with the new tag ).

The next release of libwayshot will support "freezing" outputs for screenshots to enable screenshoting floating dialogs that are ephemeral in nature. Would this be a feature that is in scope of screenshot-rs? I would be happy to send a patch.

capture() fn returning none is some mac

My friend uses this crate for taking screenshots in Mac OS X (version 12.2.1), but after the Mac OS X update (version 13.0.1),
In capture fn, it returns null. Is this crate dependent on any driver or software on the Mac?

Saving screenshot as JPEG only produces garbage

This works as expected:

    image
        .save(format!("monitor-{}.png", normalized(monitor.name())))
        .unwrap();

This produces a completely broken JPEG file:

    image
        .save(format!("monitor-{}.jpg", normalized(monitor.name())))
        .unwrap();

I'm crosscompiling from linux to windows using cargo build --target x86_64-pc-windows-gnu.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.