#av #camera #file-types #video #h #clean-up

bin+lib imagesnap

A CLI for capturing images 📷 📸 🖼️

1 unstable release

0.0.1 May 13, 2021


291 lines


A CLI for capturing images on macOS 📷 📸 🖼️

This crate also doubles as a Rust library. 🦀


via Homebrew

brew install smudge/smudge/imagesnap

via Cargo

Set up Rust/Cargo and install from crates.io by running:

cargo install imagesnap


Command-Line Interface

Run the command without any arguments to output snapshot.jpg, captured from the default camera:

$ imagesnap
Capturing image from device "iSight"..................snapshot.jpg

The filename can be changed by specifying an argument. Only JPG files are currently supported:

$ imagesnap shot1.jpg
Capturing image from device "iSight"..................shot1.jpg

Use the -l flag to list all available image capture devices:

$ imagesnap -l

Use the -d flag to use a specific device:

$ imagesnap -d DV
Capturing image from device "DV"..................snapshot.jpg

Use the -w flag to specify a warmup period (default is 0.5), allowing the camera to perform light balancing and/or focus before taking a shot:

$ imagesnap -w 2.5
Capturing image from device "iSight"...........................snapshot.jpg

Use the -q flag to silence the status and progress output.

Lastly, run the command with -h/--help to see usage instructions.

Rust API

In addition to a CLI, imagesnap can be pulled-in as a dependency for other Rust crates:

imagesnap = "0.0.1"

To snap an image with the default camera, use Camera::default:

let camera = Camera::default();

Note that snap is an async function.

If more than one camera is attached, use Camera::new and specify a device:

let camera = Camera::new(Device::find("FaceTime"), None);

To discover all devices, use Device::all().

An optional warmup period may also be specificied (in seconds):

let camera = Camera::new(Device::default(), 1.5);

If left unspecified, it will default to 0.5 seconds.


  • Basic functionality working (snap image to file)
  • Add additional opts like 'quiet' and 'warmup'
  • Get device selection working
  • Clean up code, work on generic lib interface
  • Update README with library usage
  • Support additional file types? (png, tif, etc?)
  • Add Linux support (via rscam)
  • Add Windows support (via escapi)
  • Get STDOUT and pipe detection working (macOS/linux)

Thanks To:


  • Check the issue tracker and consider creating a new issue.
  • Fork the project and create a new branch for your contribution.
  • Write, commit, and push your contribution to your branch.
  • Make sure the project builds (cargo build) and functionality still works as expected.
  • Submit a pull request.


Licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~29K SLoC