{"id":16384602,"url":"https://github.com/nashaofu/xcap","last_synced_at":"2026-03-01T12:06:44.294Z","repository":{"id":37856660,"uuid":"467110903","full_name":"nashaofu/xcap","owner":"nashaofu","description":"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 (WIP).","archived":false,"fork":false,"pushed_at":"2026-03-01T02:33:16.000Z","size":2412,"stargazers_count":915,"open_issues_count":44,"forks_count":121,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-03-01T05:57:47.250Z","etag":null,"topics":["monitor","screen-capture","screen-record","screencapture","windows"],"latest_commit_sha":null,"homepage":"https://docs.rs/xcap","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nashaofu.png","metadata":{"files":{"readme":"README-zh_CN.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["nashaofu"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2022-03-07T13:43:12.000Z","updated_at":"2026-02-27T16:30:16.000Z","dependencies_parsed_at":"2023-07-14T08:55:50.486Z","dependency_job_id":"d67fe7bd-838c-44bb-bfdb-a7991c0d0be7","html_url":"https://github.com/nashaofu/xcap","commit_stats":{"total_commits":60,"total_committers":6,"mean_commits":10.0,"dds":0.08333333333333337,"last_synced_commit":"68d651aa77fdca346c855d40c301975e9b69f1f6"},"previous_names":["nashaofu/screen-capturer","nashaofu/xcap","nashaofu/screenshots-rs"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/nashaofu/xcap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nashaofu%2Fxcap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nashaofu%2Fxcap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nashaofu%2Fxcap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nashaofu%2Fxcap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nashaofu","download_url":"https://codeload.github.com/nashaofu/xcap/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nashaofu%2Fxcap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29969243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T11:43:06.159Z","status":"ssl_error","status_checked_at":"2026-03-01T11:43:03.887Z","response_time":124,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["monitor","screen-capture","screen-record","screencapture","windows"],"created_at":"2024-10-11T04:11:53.495Z","updated_at":"2026-03-01T12:06:44.288Z","avatar_url":"https://github.com/nashaofu.png","language":"Rust","funding_links":["https://github.com/sponsors/nashaofu"],"categories":[],"sub_categories":[],"readme":"# XCap\n\n[English](README.md) | 简体中文\n\nXCap 是一个使用 Rust 编写的跨平台的屏幕捕获库，它支持 Linux(X11,Wayland)、MacOS 与 Windows。XCap 支持截图与视频录制（实现中）。\n\n## 功能\n\n-   跨平台: 支持 Linux(X11,Wayland)、MacOS 与 Windows。\n-   支持多种截图模式: 可以对屏幕与窗口进行截图。\n-   支持视频录制：支持对屏幕或窗口进行录制（实现中）。\n\n### 实现状态\n\n| 功能     | Linux(X11) | Linux(Wayland) | MacOS | Windows(\u003e=Windows 8.1) |\n| -------- | ---------- | -------------- | ----- | ---------------------- |\n| 屏幕截图 | ✅         | ⛔             | ✅    | ✅                     |\n| 窗口截图 | ✅         | ⛔             | ✅    | ✅                     |\n| 屏幕录制 | ✅         | ⛔             | ✅    | ✅                     |\n| 窗口录制 | 🛠️         | 🛠️             | 🛠️    | 🛠️                     |\n\n-   ✅: 功能可用\n-   ⛔: 功能可用，但在一些特殊场景下未完全支持\n-   🛠️: 待开发\n\n## 例子\n\n-   屏幕截图\n\n```rust\nuse fs_extra::dir;\nuse std::time::Instant;\nuse xcap::Monitor;\n\nfn normalized(filename: String) -\u003e String {\n    filename.replace(['|', '\\\\', ':', '/'], \"\")\n}\n\nfn main() {\n    let start = Instant::now();\n    let monitors = Monitor::all().unwrap();\n\n    dir::create_all(\"target/monitors\", true).unwrap();\n\n    for monitor in monitors {\n        let image = monitor.capture_image().unwrap();\n\n        image\n            .save(format!(\n                \"target/monitors/monitor-{}.png\",\n                normalized(monitor.name().unwrap())\n            ))\n            .unwrap();\n    }\n\n    println!(\"运行耗时: {:?}\", start.elapsed());\n}\n\n```\n\n- 屏幕区域截图\n\n```rust\nuse fs_extra::dir;\nuse std::time::Instant;\nuse xcap::Monitor;\n\nfn normalized(filename: String) -\u003e String {\n    filename.replace(['|', '\\\\', ':', '/'], \"\")\n}\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let monitors = Monitor::all()?;\n    dir::create_all(\"target/monitors\", true).unwrap();\n\n    let monitor = monitors\n        .into_iter()\n        .find(|m| m.is_primary().unwrap_or(false))\n        .expect(\"No primary monitor found\");\n\n    let monitor_width = monitor.width()?;\n    let monitor_height = monitor.height()?;\n\n    let region_width = 400u32;\n    let region_height = 300u32;\n\n    let x = ((monitor_width as i32) - (region_width as i32)) / 2;\n    let y = ((monitor_height as i32) - (region_height as i32)) / 2;\n    let start = Instant::now();\n\n    let image = monitor.capture_region(x, y, region_width, region_height)?;\n    println!(\n        \"Time to record region of size {}x{}: {:?}\",\n        image.width(),\n        image.height(),\n        start.elapsed()\n    );\n\n    image\n        .save(format!(\n            \"target/monitors/monitor-{}-region.png\",\n            normalized(monitor.name().unwrap())\n        ))\n        .unwrap();\n\n    Ok(())\n}\n\n```\n\n-   屏幕录制\n\n```rust\nuse std::{thread, time::Duration};\nuse xcap::Monitor;\n\nfn main() {\n    let monitor = Monitor::from_point(100, 100).unwrap();\n\n    let (video_recorder, sx) = monitor.video_recorder().unwrap();\n\n    thread::spawn(move || loop {\n        match sx.recv() {\n            Ok(frame) =\u003e {\n                println!(\"frame: {:?}\", frame.width);\n            }\n            _ =\u003e continue,\n        }\n    });\n\n    println!(\"start\");\n    video_recorder.start().unwrap();\n    thread::sleep(Duration::from_secs(2));\n    println!(\"stop\");\n    video_recorder.stop().unwrap();\n    thread::sleep(Duration::from_secs(2));\n    println!(\"start\");\n    video_recorder.start().unwrap();\n    thread::sleep(Duration::from_secs(2));\n    println!(\"stop\");\n    video_recorder.stop().unwrap();\n}\n\n```\n\n-   窗口截图\n\n```rust\nuse fs_extra::dir;\nuse std::time::Instant;\nuse xcap::Window;\n\nfn normalized(filename: \u0026str) -\u003e String {\n    filename.replace(['|', '\\\\', ':', '/'], \"\")\n}\n\nfn main() {\n    let start = Instant::now();\n    let windows = Window::all().unwrap();\n\n    dir::create_all(\"target/windows\", true).unwrap();\n\n    let mut i = 0;\n    for window in windows {\n        // 最小化的窗口不能截屏\n        if window.is_minimized().unwrap() {\n            continue;\n        }\n\n        println!(\n            \"Window: {:?} {:?} {:?}\",\n            window.title().unwrap(),\n            (\n                window.x().unwrap(),\n                window.y().unwrap(),\n                window.width().unwrap(),\n                window.height().unwrap()\n            ),\n            (\n                window.is_minimized().unwrap(),\n                window.is_maximized().unwrap()\n            )\n        );\n\n        let image = window.capture_image().unwrap();\n        image\n            .save(format!(\n                \"target/windows/window-{}-{}.png\",\n                i,\n                normalized(\u0026window.title().unwrap())\n            ))\n            .unwrap();\n\n        i += 1;\n    }\n\n    println!(\"运行耗时: {:?}\", start.elapsed());\n}\n\n```\n\n更多例子可以在 [examples](./examples) 目录中找到。\n\n## Linux 系统要求\n\n在 Linux 上，需要安装下面这些依赖才能正常编译。\n\nDebian/Ubuntu:\n\n```sh\napt-get install pkg-config libclang-dev libxcb1-dev libxrandr-dev libdbus-1-dev libpipewire-0.3-dev libwayland-dev libegl-dev\n```\n\nAlpine:\n\n```sh\napk add pkgconf llvm19-dev clang19-dev libxcb-dev libxrandr-dev dbus-dev pipewire-dev wayland-dev mesa-dev\n```\n\nArchLinux:\n\n```sh\npacman -S base-devel clang libxcb libxrandr dbus libpipewire\n```\n\n## License\n\n本项目采用 Apache 许可证。详情请查看 [LICENSE](./LICENSE) 文件。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnashaofu%2Fxcap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnashaofu%2Fxcap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnashaofu%2Fxcap/lists"}