#low-level #jpeg #png #exif #container-image #icc #encoding

no-std img-parts

Low level crate for reading and writing Jpeg, Png and RIFF image containers

8 releases

new 0.3.1 Oct 26, 2024
0.3.0 Aug 11, 2022
0.2.3 Oct 14, 2020
0.2.2 Sep 17, 2020
0.1.0 Apr 1, 2020

#321 in Images

Download history 26231/week @ 2024-07-06 34570/week @ 2024-07-13 36828/week @ 2024-07-20 38652/week @ 2024-07-27 26398/week @ 2024-08-03 50632/week @ 2024-08-10 44947/week @ 2024-08-17 22129/week @ 2024-08-24 21881/week @ 2024-08-31 25389/week @ 2024-09-07 30175/week @ 2024-09-14 28849/week @ 2024-09-21 32056/week @ 2024-09-28 31900/week @ 2024-10-05 22701/week @ 2024-10-12 24538/week @ 2024-10-19

116,229 downloads per month
Used in 15 crates (10 directly)

MIT/Apache

67KB
1.5K SLoC

img-parts

crates.io Documentation dependency status Rustc Version 1.57.0+ CI

The img-parts crate provides a low level API for reading and writing containers from various image formats, and a high level API for reading and writing raw ICC profiles and EXIF metadata.

It currently supports Jpeg, Png and RIFF (with some helper functions for WebP).

More examples can be found in the examples directory on GitHub.

Reading and writing raw ICCP and EXIF metadata

use std::fs::{self, File};

use img_parts::jpeg::Jpeg;
use img_parts::{ImageEXIF, ImageICC};

let input = fs::read("img.jpg")?;
let output = File::create("out.jpg")?;

let mut jpeg = Jpeg::from_bytes(input.into())?;
let icc_profile = jpeg.icc_profile();
let exif_metadata = jpeg.exif();

jpeg.set_icc_profile(Some(another_icc_profile.into()));
jpeg.set_exif(Some(new_exif_metadata.into()));
jpeg.encoder().write_to(output)?;

Modifying chunks

use std::fs::{self, File};

use img_parts::jpeg::{markers, Jpeg, JpegSegment};
use img_parts::Bytes;

let input = fs::read("img.jpg")?;
let output = File::create("out.jpg")?;

let mut jpeg = Jpeg::from_bytes(input.into())?;

let comment = Bytes::from("Hello, I'm writing a comment!");
let comment_segment = JpegSegment::new_with_contents(markers::COM, comment);
jpeg.segments_mut().insert(1, comment_segment);

jpeg.encoder().write_to(output)?;

License

Licensed under either of

at your option.

Contribution

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

Dependencies

~425KB