cc-xcap 0.1.5

Forked from xcap, CC-XCap is a cross-platform screen capture library written in Rust, forked from xcap. It supports Linux (X11, Wayland), MacOS, and Windows. CC-XCap supports screenshot and video recording (WIP).
use cc_xcap::Window;
use fs_extra::dir;
use std::time::Instant;

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

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

    // 创建输出目录
    dir::create_all("target/thumbnails", true).unwrap();

    let windows = Window::list_all().unwrap();
    println!("Total windows: {}", windows.len());

    let mut i = 0;
    for window in windows {
        // 跳过最小化的窗口
        if window.is_minimized().unwrap() {
            continue;
        }

        let title = window.title().unwrap_or_else(|_| "Unknown".to_string());
        let app_name = window.app_name().unwrap_or_else(|_| "Unknown".to_string());

        println!(
            "Processing: {} ({}) - Size: {}x{}",
            title,
            app_name,
            window.width().unwrap(),
            window.height().unwrap()
        );

        // 捕获原始图片
        let original_start = Instant::now();
        let original_image = match window.capture_image() {
            Ok(img) => img,
            Err(e) => {
                println!("Failed to capture original image: {}", e);
                continue;
            }
        };
        let original_time = original_start.elapsed();

        // 捕获缩略图
        let thumbnail_start = Instant::now();
        let thumbnail_image = match window.capture_thumbnail() {
            Ok(img) => img,
            Err(e) => {
                println!("Failed to capture thumbnail: {}", e);
                continue;
            }
        };
        let thumbnail_time = thumbnail_start.elapsed();

        // 保存原始图片
        let original_filename = format!(
            "target/thumbnails/original-{}-{}.png",
            i,
            normalized(&title)
        );
        if let Err(e) = original_image.save(&original_filename) {
            println!("Failed to save original image: {}", e);
        }

        // 保存缩略图
        let thumbnail_filename = format!(
            "target/thumbnails/thumbnail-{}-{}.png",
            i,
            normalized(&title)
        );
        if let Err(e) = thumbnail_image.save(&thumbnail_filename) {
            println!("Failed to save thumbnail: {}", e);
        }

        // 输出对比信息
        println!(
            "  Original: {}x{} ({}KB) - Time: {:?}",
            original_image.width(),
            original_image.height(),
            original_image.len() / 1024,
            original_time
        );
        println!(
            "  Thumbnail: {}x{} ({}KB) - Time: {:?}",
            thumbnail_image.width(),
            thumbnail_image.height(),
            thumbnail_image.len() / 1024,
            thumbnail_time
        );
        println!(
            "  Compression ratio: {:.1}%",
            (thumbnail_image.len() as f64 / original_image.len() as f64) * 100.0
        );
        println!();

        i += 1;

        // 只处理前5个窗口作为示例
        if i >= 5 {
            break;
        }
    }

    println!("运行耗时: {:?}", start.elapsed());
    println!("图片已保存到 target/thumbnails/ 目录");
    println!(
        "原始图片文件名格式: original-{}-{}.png",
        "{index}", "{title}"
    );
    println!(
        "缩略图文件名格式: thumbnail-{}-{}.png",
        "{index}", "{title}"
    );
}