Expand description

Upgrade Guide

Upgrade from 0.4.x to 0.5.x

API compatibilities

  • Reader has been split into two: Reader and Exif. Reader is now the builder for Exif, and Exif provides access to Fields via get_field, fields, and other methods. Old code Reader::new(data) should be changed to Reader::new().read_raw(data) or Reader::new().read_from_container(data).

    The old code using 0.4.x:

    let 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 from 0.3.x to 0.4.x

API compatibilities

  • Use struct In instead of bool to indicate primary/thumbnail images.
    • On Reader::get_field, the old code using 0.3.x:
      reader.get_field(Tag::DateTime, false)
      The new code using 0.4.x:
      reader.get_field(Tag::DateTime, In::PRIMARY)
      As 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::ImageWidth, In(2))
    • On Field, the old code using 0.3.x:
      if field.thumbnail {
          // for the thumbnail image
      } else {
          // for the primary image
      }
      The new code using 0.4.x:
      match field.ifd_num {
          In::PRIMARY => {},   // for the primary image
          In::THUMBNAIL => {}, // for the thumbnail image
          _ => {},
      }
  • Reader::fields now returns an iterator instead of a slice.
  • Enum variants of Context and Error are no longer exhaustive. You need a wildcard arm (_) in a match expression.
  • The associated value of Value::Undefined and Value::Ascii has been changed from a slice to a Vec.

Other new features

  • Field::display_value has been introduced. It is usually handier than Value::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.
    // 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 and Field are self-contained and no longer borrow the raw buffer or Reader (thanks to the change of Value::Undefined and Value::Ascii described above).