rust 截图全屏 保存jpg图片

180it 2024-10-27 PM 103℃ 0条

为了设置 JPG 图像的质量,我们可以使用 image::jpeg::JpegEncoder 并设置质量参数。以下是详细的步骤和代码实现:

代码实现

use image::{ImageBuffer, Rgba};
use image::codecs::jpeg::JpegEncoder;
use scrap::{Capturer, Display};
use std::fs::File;
use std::io::{self, Result, BufWriter};
use std::thread;
use std::time::Duration;

fn main() -> Result<()> {
    // 获取主显示器
    let display = Display::primary().expect("无法获取主显示器");
    let mut capturer = Capturer::new(display).expect("无法创建屏幕捕获器");

    // 获取显示器的宽度和高度
    let (width, height) = (capturer.width(), capturer.height());

    // 等待屏幕捕获器准备好
    thread::sleep(Duration::from_millis(100));

    // 捕获屏幕
    let frame = loop {
        match capturer.frame() {
            Ok(buffer) => break buffer,
            Err(error) => {
                if error.kind() == std::io::ErrorKind::WouldBlock {
                    // 捕获器还没有准备好,等待一段时间
                    thread::sleep(Duration::from_millis(10));
                    continue;
                } else {
                    panic!("屏幕捕获失败: {}", error);
                }
            }
        }
    };

    // 将捕获的帧转换为图像缓冲区
    let mut img_buffer = ImageBuffer::new(width as u32, height as u32);
    let stride = frame.len() / height;
    for y in 0..height {
        for x in 0..width {
            let i = y * stride + x * 4;
            let pixel = Rgba([frame[i + 2], frame[i + 1], frame[i], 255]);
            img_buffer.put_pixel(x as u32, y as u32, pixel);
        }
    }

    // 打开输出文件
    let output_file = File::create("temp.jpg")?;
    let mut writer = BufWriter::new(output_file);

    // 创建 JPEG 编码器并设置质量为 90
    let mut encoder = JpegEncoder::new_with_quality(&mut writer, 90);
    encoder.encode_image(&img_buffer).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;

    Ok(())
}

说明

  1. 获取主显示器:使用 scrap::Display::primary 获取主显示器。
  2. 创建屏幕捕获器:使用 scrap::Capturer::new 创建屏幕捕获器。
  3. 获取显示器的宽度和高度:从捕获器中获取显示器的宽度和高度。
  4. 等待屏幕捕获器准备好:使用 thread::sleep 等待一段时间,确保捕获器准备好。
  5. 捕获屏幕:使用 capturer.frame 捕获屏幕帧。
  6. 将捕获的帧转换为图像缓冲区:将捕获的帧数据转换为 image::ImageBuffer
  7. 保存图像为 JPG 文件:使用 image::codecs::jpeg::JpegEncoder 并设置质量为 90,将图像保存为 temp.jpg 文件。

请确保在运行此代码前,已经安装了 imagescrap 库,并且你的系统支持屏幕捕获。

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

rust 截图全屏 保存jpg图片