[−][src]Crate exif
This is a pure-Rust library to parse Exif data.
This library parses Exif attributes in a raw Exif data block. It can also read Exif data directly from some image formats including TIFF, JPEG, and HEIF.
Examples
An example to parse JPEG/TIFF files:
for path in &["tests/exif.jpg", "tests/exif.tif"] { let file = std::fs::File::open(path)?; let mut bufreader = std::io::BufReader::new(&file); let exifreader = exif::Reader::new(); let exif = exifreader.read_from_container(&mut bufreader)?; for f in exif.fields() { println!("{} {} {}", f.tag, f.ifd_num, f.display_value().with_unit(&exif)); } }
Upgrade Guide from 0.4.x to 0.5.x
API compatibilities
-
Reader
has been split into two:Reader
andExif
.Reader
is now the builder forExif
, andExif
provides access toField
s viaget_field
,fields
, and other methods. Old codeReader::new(data)
should be changed toReader::new().read_raw(data)
orReader::new().read_from_container(data)
.The old code using 0.4.x:
ⓘThis example is not testedlet reader = Reader::new(&mut bufreader).unwrap(); for f in reader.fields() { /* do something */ }
The new code using 0.5.x:
let exif = Reader::new().read_from_container(&mut bufreader).unwrap(); for f in exif.fields() { /* do something */ }
Other new features
- Support for parsing Exif in HEIF (HEIC/AVIF) has been added.
Upgrade Guide from 0.3.x to 0.4.x
API compatibilities
- Use struct
In
instead ofbool
to indicate primary/thumbnail images.- On
Reader::get_field
, the old code using 0.3.x:ⓘThis example is not testedThe new code using 0.4.x:reader.get_field(Tag::DateTime, false)
ⓘThis example is not testedAs an additional feature, access to the 2nd or further IFD, which some TIFF-based RAW formats may have, is also possible with 0.4.x:reader.get_field(Tag::DateTime, In::PRIMARY)
ⓘThis example is not testedreader.get_field(Tag::ImageWidth, In(2))
- On
Field
, the old code using 0.3.x:ⓘThis example is not testedThe new code using 0.4.x:if field.thumbnail { // for the thumbnail image } else { // for the primary image }
match field.ifd_num { In::PRIMARY => {}, // for the primary image In::THUMBNAIL => {}, // for the thumbnail image _ => {}, }
- On
Reader::fields
now returns an iterator instead of a slice.- Enum variants of
Context
andError
are no longer exhaustive. You need a wildcard arm (_
) in a match expression. - The associated value of
Value::Undefined
andValue::Ascii
has been changed from a slice to aVec
.
Other new features
Field::display_value
has been introduced. It is usually handier thanValue::display_as
.assert_eq!(field.display_value().to_string(), field.value.display_as(field.tag).to_string());
- Displaying a value with its unit is supported.
ⓘThis example is not tested
// Display the value only. println!("{}", field.display_value()); // Display the value with its unit. If the unit depends on another // field, it is taken from the reader. println!("{}", field.display_value().with_unit(&reader));
Value
andField
are self-contained and no longer borrow the raw buffer orReader
(thanks to the change ofValue::Undefined
andValue::Ascii
described above).
Modules
experimental | The interfaces in this module are experimental and unstable. |
Structs
DateTime | A struct used to parse a DateTime field. |
Exif | A struct that holds the parsed Exif attributes. |
Field | A TIFF field. |
In | The IFD number. |
Rational | An unsigned rational number, which is a pair of 32-bit unsigned integers. |
Reader | A struct to parse the Exif attributes and
create an |
SRational | A signed rational number, which is a pair of 32-bit signed integers. |
Tag | A tag of a TIFF field. |
Enums
Context | An enum that indicates how a tag number is interpreted. |
Error | An error type returned when parsing Exif data. |
Value | Types and values of TIFF fields (for Exif attributes). |
Functions
get_exif_attr_from_jpeg | Get the Exif attribute information segment from a JPEG file. |
parse_exif | Parse the Exif attributes in the TIFF format. |