feat: add first iteration of screen capture
Diff
Cargo.toml | 1 +
src/main.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 58 insertions(+), 1 deletion(-)
@@ -6,3 +6,4 @@ edition = "2021"
[dependencies]
screenshots = "0.8.6"
@@ -1,3 +1,59 @@
use screenshots::{image::ImageBuffer, Screen};
fn main() {
println!("Hello, world!");
capture_all();
}
fn capture_all() {
let mut screens = Screen::all().unwrap_or_else(|err| {
eprintln!("there was an error retrieving screens: {:?}", err);
vec![]
});
screens.sort_by(|first, second| first.display_info.x.cmp(&second.display_info.x));
let captures: Vec<_> = screens
.iter()
.filter_map(|screen| screen.capture().ok())
.collect();
let dimensions = captures
.iter()
.fold(ImageDimensions::default(), |t, buf| ImageDimensions {
x: t.x + buf.width(),
y: t.y.max(buf.height()),
});
let mut img = ImageBuffer::new(dimensions.x, dimensions.y);
captures
.iter()
.fold(ImageDimensions::default(), |offset, buf| {
for (x, y, pixel) in buf.enumerate_pixels() {
img.put_pixel(offset.x + x, y, *pixel);
}
ImageDimensions {
x: offset.x + buf.width(),
y: offset.y,
}
});
if !img.is_empty() {
match img.save("target/capture.png") {
Ok(_) => println!("screenshot saved successfully!"),
Err(err) => println!("there was an error saving the image: {:?}", err),
}
}
}
#[derive(Default)]
struct ImageDimensions {
pub x: u32,
pub y: u32,
}
impl std::fmt::Display for ImageDimensions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("({}, {})", self.x, self.y))
}
}