From 8ffc5ced3f83013405a747210180e004c714659c Mon Sep 17 00:00:00 2001 From: KAMADA Ken'ichi Date: Sun, 16 Jul 2017 15:16:56 +0900 Subject: [PATCH] Add an example to read various fields. --- examples/reading.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++ tests/exif.jpg | Bin 1236 -> 1260 bytes 2 files changed, 80 insertions(+) create mode 100644 examples/reading.rs diff --git a/examples/reading.rs b/examples/reading.rs new file mode 100644 index 0000000..e72587f --- /dev/null +++ b/examples/reading.rs @@ -0,0 +1,80 @@ +// +// Copyright (c) 2017 KAMADA Ken'ichi. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// + +extern crate exif; + +use std::fs::File; +use std::io::BufReader; + +use exif::{DateTime, Reader, Value, tag}; + +fn main() { + let file = File::open("tests/exif.jpg").unwrap(); + let reader = Reader::new(&mut BufReader::new(&file)).unwrap(); + + // To obtain a string representation, `Value::display_as` can be used + // for any tag. + let tag_list = [tag::ExifVersion, + tag::ImageWidth, + tag::XResolution, + tag::ImageDescription, + tag::DateTime]; + for &tag in tag_list.iter() { + if let Some(field) = reader.get_field(tag, false) { + println!("{}: {}", field.tag, field.value.display_as(field.tag)); + } + } + + // To get unsigned integer value(s) from either of BYTE, SHORT, + // or LONG, `Value::get_uint` or `Value::iter_uint` can be used. + if let Some(field) = reader.get_field(tag::ImageWidth, false) { + if let Some(width) = field.value.get_uint(0) { + println!("Image width is {}.", width); + } + } + + // To convert a Rational or SRational to an f64, `Rational::to_f64` + // or `SRational::to_f64` can be used. + if let Some(field) = reader.get_field(tag::XResolution, false) { + match field.value { + Value::Rational(ref vec) if !vec.is_empty() => + println!("X resolution is {}.", vec[0].to_f64()), + _ => {}, + } + } + + // To parse a DateTime-like field, `DateTime::from_ascii` can be used. + if let Some(field) = reader.get_field(tag::DateTime, false) { + match field.value { + Value::Ascii(ref vec) if !vec.is_empty() => { + if let Ok(datetime) = DateTime::from_ascii(vec[0]) { + println!("Year of DateTime is {}.", datetime.year); + } + }, + _ => {}, + } + } +} diff --git a/tests/exif.jpg b/tests/exif.jpg index b6ca2650ba15a487fdeef939050a9a35a8f3854f..c75118462d7d6b0756a283920dc566229b771ec3 100644 GIT binary patch delta 143 zcmcb@`G#|Xczv8}MP?cUgRd`x76StV2LlHq0|N_?1*91G85!Yhc1Au1CZHHM5a%&U zF|b0_R541!*-eZZ49sA0ph`v~uzC?7zpFhHZq7U)e?v%Wafw1^Zen`s#5z~Ta~qEc GumAv0LK0U1 delta 109 zcmaFEd4+R=c&wXiMP?cUgRd`x76StV2Ll@;9|IGR#SO$^j8Y7&K$;PVlNhDp>?}qN l24=80P$i=gSiK04U(}w-zyej@2Bc?9?D1#Zw(*Vt3jpXR4ZQ#W