Added -b, -u and -P options to the utility. The -P option implements feature #468.

This commit is contained in:
Andreas Huggel 2006-05-13 06:00:39 +00:00
parent 93e6a8a307
commit c0ff4bd4b0
8 changed files with 4653 additions and 4538 deletions

View File

@ -198,9 +198,7 @@ namespace Action {
int rc = 0;
switch (Params::instance().printMode_) {
case Params::pmSummary: rc = printSummary(); break;
case Params::pmInterpreted: rc = printInterpreted(); break;
case Params::pmValues: rc = printValues(); break;
case Params::pmHexdump: rc = printHexdump(); break;
case Params::pmList: rc = printList(); break;
case Params::pmIptc: rc = printIptc(); break;
case Params::pmComment: rc = printComment(); break;
}
@ -501,7 +499,7 @@ namespace Action {
return rc;
} // Print::printTag
int Print::printInterpreted()
int Print::printList()
{
if (!Exiv2::fileExists(path_, true)) {
std::cerr << path_
@ -518,67 +516,108 @@ namespace Action {
return -3;
}
Exiv2::ExifData::const_iterator md;
bool manyFiles = Params::instance().files_.size() > 1;
bool const manyFiles = Params::instance().files_.size() > 1;
for (md = exifData.begin(); md != exifData.end(); ++md) {
std::cout << std::setfill(' ') << std::left;
if (manyFiles) {
std::cout << std::setw(20) << path_ << " ";
if ( Params::instance().unknown_
&& md->tagName().substr(0, 2) == "0x") {
continue;
}
std::cout << std::setw(44)
<< md->key() << " "
<< std::setw(9) << std::setfill(' ') << std::left
<< md->typeName() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->count() << " "
<< std::dec << *md
<< std::endl;
if (manyFiles) {
std::cout << std::setfill(' ') << std::left << std::setw(20)
<< path_ << " ";
}
bool first = true;
if (Params::instance().printItems_ & Params::prTag) {
if (!first) std::cout << " ";
first = false;
std::cout << "0x" << std::setw(4) << std::setfill('0')
<< std::right << std::hex
<< md->tag();
}
if (Params::instance().printItems_ & Params::prGroup) {
if (!first) std::cout << " ";
first = false;
std::cout << std::setw(12) << std::setfill(' ') << std::left
<< md->groupName();
}
if (Params::instance().printItems_ & Params::prKey) {
if (!first) std::cout << " ";
first = false;
std::cout << std::setfill(' ') << std::left << std::setw(44)
<< md->key();
}
if (Params::instance().printItems_ & Params::prName) {
if (!first) std::cout << " ";
first = false;
std::cout << std::setw(27) << std::setfill(' ') << std::left
<< md->tagName();
}
if (Params::instance().printItems_ & Params::prLabel) {
if (!first) std::cout << " ";
first = false;
std::cout << std::setw(30) << std::setfill(' ') << std::left
<< md->tagLabel();
}
if (Params::instance().printItems_ & Params::prType) {
if (!first) std::cout << " ";
first = false;
std::cout << std::setw(9) << std::setfill(' ') << std::left
<< md->typeName();
}
if (Params::instance().printItems_ & Params::prCount) {
if (!first) std::cout << " ";
first = false;
std::cout << std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->count();
}
if (Params::instance().printItems_ & Params::prSize) {
if (!first) std::cout << " ";
first = false;
std::cout << std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->size();
}
if (Params::instance().printItems_ & Params::prValue) {
if (!first) std::cout << " ";
first = false;
if ( Params::instance().binary_
&& md->typeId() == Exiv2::undefined
&& md->size() > 100) {
std::cout << "(Binary value suppressed)" << std::endl;
continue;
}
std::cout << std::dec << md->value();
}
if (Params::instance().printItems_ & Params::prTrans) {
if (!first) std::cout << " ";
first = false;
if ( Params::instance().binary_
&& md->typeId() == Exiv2::undefined
&& md->size() > 100) {
std::cout << "(Binary value suppressed)" << std::endl;
continue;
}
std::cout << std::dec << *md;
}
if (Params::instance().printItems_ & Params::prHex) {
if (!first) std::cout << std::endl;
first = false;
if ( Params::instance().binary_
&& md->typeId() == Exiv2::undefined
&& md->size() > 100) {
std::cout << "(Binary value suppressed)" << std::endl;
continue;
}
Exiv2::DataBuf buf(md->size());
md->copy(buf.pData_, exifData.byteOrder());
Exiv2::hexdump(std::cout, buf.pData_, buf.size_);
}
std::cout << std::endl;
}
return 0;
} // Print::printInterpreted
int Print::printValues()
{
if (!Exiv2::fileExists(path_, true)) {
std::cerr << path_
<< ": Failed to open the file\n";
return -1;
}
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path_);
assert(image.get() != 0);
image->readMetadata();
Exiv2::ExifData &exifData = image->exifData();
if (exifData.empty()) {
std::cerr << path_
<< ": No Exif data found in the file\n";
return -3;
}
Exiv2::ExifData::const_iterator end = exifData.end();
Exiv2::ExifData::const_iterator md;
bool manyFiles = Params::instance().files_.size() > 1;
for (md = exifData.begin(); md != end; ++md) {
if (manyFiles) {
std::cout << std::setfill(' ') << std::left
<< std::setw(20) << path_ << " ";
}
std::cout << "0x" << std::setw(4) << std::setfill('0') << std::right
<< std::hex << md->tag() << " "
<< std::setw(9) << std::setfill(' ') << std::left
<< md->ifdName() << " "
<< std::setw(27) << std::setfill(' ') << std::left
<< md->tagName() << " "
<< std::setw(9) << std::setfill(' ') << std::left
<< md->typeName() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->count() << " "
<< std::dec << md->value()
<< std::endl;
}
return 0;
} // Print::printValues
} // Print::printList
int Print::printIptc()
{
@ -618,51 +657,6 @@ namespace Action {
return 0;
} // Print::printIptc
int Print::printHexdump()
{
if (!Exiv2::fileExists(path_, true)) {
std::cerr << path_
<< ": Failed to open the file\n";
return -1;
}
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path_);
assert(image.get() != 0);
image->readMetadata();
Exiv2::ExifData &exifData = image->exifData();
if (exifData.empty()) {
std::cerr << path_
<< ": No Exif data found in the file\n";
return -3;
}
Exiv2::ExifData::const_iterator md;
bool manyFiles = Params::instance().files_.size() > 1;
for (md = exifData.begin(); md != exifData.end(); ++md) {
std::cout << std::setfill(' ') << std::left;
if (manyFiles) {
std::cout << std::setw(20) << path_ << " ";
}
std::cout << std::setw(4)
<< md->ifdName() << " "
<< "0x" << std::setw(4) << std::setfill('0') << std::right
<< std::hex << md->tag() << " "
<< std::setw(9) << std::setfill(' ') << std::left
<< md->typeName() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->count() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->size() << " "
<< std::setw(27) << std::setfill(' ') << std::left
<< md->tagName() << std::endl;
Exiv2::DataBuf buf(md->size());
md->copy(buf.pData_, exifData.byteOrder());
Exiv2::hexdump(std::cout, buf.pData_, buf.size_);
}
return 0;
} // Print::printHexdump
int Print::printComment()
{
if (!Exiv2::fileExists(path_, true)) {

View File

@ -166,12 +166,8 @@ namespace Action {
int printIptc();
//! Print Exif summary information
int printSummary();
//! Print the interpreted value for each Exif tag
int printInterpreted();
//! Print uninterpreted Exif information
int printValues();
//! Print Exif information in hexdump format
int printHexdump();
//! Print the list of Exif data in user defined format
int printList();
//! Print the label for a summary line
void printLabel(const std::string& label) const;
/*!

View File

@ -80,6 +80,12 @@ Show the program version and exit.
.B \-v
Be verbose during the program run.
.TP
.B \-b
Don't show large binary values.
.TP
.B \-u
Don't show unknown tags.
.TP
.B \-k
Preserve file timestamps when updating files (keep). Can be used with
all options which update files. The flag is ignored by read-only
@ -112,16 +118,42 @@ Print mode for the 'print' action. Possible modes are:
.br
s : print a summary of the EXIF metadata (the default)
.br
t : interpreted (translated) EXIF data
t : interpreted (translated) EXIF data (shortcut for -Pkyct)
.br
v : plain EXIF data values
v : plain EXIF data values (shortcut for -Pxgnycv)
.br
h : hexdump of the EXIF data
h : hexdump of the EXIF data (shortcut for -Pxgnycsh)
.br
i : IPTC data values
.br
c : JPEG comment
.TP
.B \-P \fIcols\fP
Print columns for the Exif taglist ('print' action), allows detailed
control of the print output. Valid are:
.br
x : print a column with the tag value
.br
g : group name
.br
k : key
.br
l : tag label
.br
n : tag name
.br
y : type
.br
c : number of components (count)
.br
s : size in bytes
.br
v : plain data value
.br
t : interpreted (translated) data
.br
h : hexdump of the data
.TP
.B \-d \fItgt\fP
Delete target(s) for the 'delete' action. Possible targets are:
.br

View File

@ -218,6 +218,8 @@ void Params::help(std::ostream& os) const
<< " -h Display this help and exit.\n"
<< " -V Show the program version and exit.\n"
<< " -v Be verbose during the program run.\n"
<< " -b Don't show large binary values.\n"
<< " -u Don't show unknown tags.\n"
<< " -k Preserve file timestamps (keep).\n"
<< " -t Also set the file timestamp in 'rename' action (overrides -k).\n"
<< " -T Only set the file timestamp in 'rename' action, do not rename\n"
@ -228,11 +230,23 @@ void Params::help(std::ostream& os) const
<< " is only used with the 'adjust' action.\n"
<< " -p mode Print mode for the 'print' action. Possible modes are:\n"
<< " s : print a summary of the Exif metadata (the default)\n"
<< " t : interpreted (translated) Exif data\n"
<< " v : plain Exif data values\n"
<< " h : hexdump of the Exif data\n"
<< " t : interpreted (translated) Exif data (shortcut for -Pkyct)\n"
<< " v : plain Exif data values (shortcut for -Pxgnycv)\n"
<< " h : hexdump of the Exif data (shortcut for -Pxgnycsh)\n"
<< " i : Iptc data values\n"
<< " c : Jpeg comment\n"
<< " -P cols Print columns for the Exif taglist ('print' action). Valid are:\n"
<< " x : print a column with the tag value\n"
<< " g : group name\n"
<< " k : key\n"
<< " l : tag label\n"
<< " n : tag name\n"
<< " y : type\n"
<< " c : number of components (count)\n"
<< " s : size in bytes\n"
<< " v : plain data value\n"
<< " t : interpreted (translated) data\n"
<< " h : hexdump of the data\n"
<< " -d tgt Delete target(s) for the 'delete' action. Possible targets are:\n"
<< " a : all supported metadata (the default)\n"
<< " e : Exif section\n"
@ -264,6 +278,8 @@ int Params::option(int opt, const std::string& optarg, int optopt)
case 'V': version_ = true; break;
case 'v': verbose_ = true; break;
case 'k': preserve_ = true; break;
case 'b': binary_ = true; break;
case 'u': unknown_ = true; break;
case 'f': force_ = true; fileExistsPolicy_ = overwritePolicy; break;
case 'F': force_ = true; fileExistsPolicy_ = renamePolicy; break;
case 'r': rc = evalRename(opt, optarg); break;
@ -271,6 +287,7 @@ int Params::option(int opt, const std::string& optarg, int optopt)
case 'T': rc = evalRename(opt, optarg); break;
case 'a': rc = evalAdjust(optarg); break;
case 'p': rc = evalPrint(optarg); break;
case 'P': rc = evalPrintCols(optarg); break;
case 'd': rc = evalDelete(optarg); break;
case 'e': rc = evalExtract(optarg); break;
case 'i': rc = evalInsert(optarg); break;
@ -358,12 +375,11 @@ int Params::evalPrint(const std::string& optarg)
int rc = 0;
switch (action_) {
case Action::none:
action_ = Action::print;
switch (optarg[0]) {
case 's': printMode_ = pmSummary; break;
case 't': printMode_ = pmInterpreted; break;
case 'v': printMode_ = pmValues; break;
case 'h': printMode_ = pmHexdump; break;
case 't': rc = evalPrintCols("kyct"); break;
case 'v': rc = evalPrintCols("xgnycv"); break;
case 'h': rc = evalPrintCols("xgnycsh"); break;
case 'i': printMode_ = pmIptc; break;
case 'c': printMode_ = pmComment; break;
default:
@ -386,6 +402,47 @@ int Params::evalPrint(const std::string& optarg)
return rc;
} // Params::evalPrint
int Params::evalPrintCols(const std::string& optarg)
{
int rc = 0;
switch (action_) {
case Action::none:
action_ = Action::print;
printMode_ = pmList;
for (std::size_t i = 0; i < optarg.length(); ++i) {
switch (optarg[i]) {
case 'x': printItems_ |= prTag; break;
case 'g': printItems_ |= prGroup; break;
case 'k': printItems_ |= prKey; break;
case 'l': printItems_ |= prLabel; break;
case 'n': printItems_ |= prName; break;
case 'y': printItems_ |= prType; break;
case 'c': printItems_ |= prCount; break;
case 's': printItems_ |= prSize; break;
case 'v': printItems_ |= prValue; break;
case 't': printItems_ |= prTrans; break;
case 'h': printItems_ |= prHex; break;
default:
std::cerr << progname() << ": Unrecognized print item `"
<< optarg[i] << "'\n";
rc = 1;
break;
}
}
break;
case Action::print:
std::cerr << progname()
<< ": Ignoring surplus option -P" << optarg << "\n";
break;
default:
std::cerr << progname()
<< ": Option -P is not compatible with a previous option\n";
rc = 1;
break;
}
return rc;
} // Params::evalPrintCols
int Params::evalDelete(const std::string& optarg)
{
int rc = 0;

View File

@ -123,8 +123,23 @@ public:
void cleanup();
//! Enumerates print modes
enum PrintMode { pmSummary, pmInterpreted, pmValues, pmHexdump, pmIptc,
pmComment };
enum PrintMode { pmSummary, pmList, pmIptc, pmComment };
//! Individual items to print
enum PrintItem {
prTag = 1,
prGroup = 2,
prKey = 4,
prName = 8,
prLabel = 16,
prType = 32,
prCount = 64,
prSize = 128,
prValue = 256,
prTrans = 512,
prHex = 1024
};
//! Enumerates common targets, bitmap
enum CommonTarget { ctExif = 1, ctIptc = 2, ctComment = 4, ctThumb = 8 };
//! Enumerates the policies to handle existing files in rename action
@ -134,12 +149,15 @@ public:
bool version_; //!< Version option flag.
bool verbose_; //!< Verbose (talkative) option flag.
bool force_; //!< Force overwrites flag.
bool binary_; //!< Suppress long binary values.
bool unknown_; //!< Suppress unknown tags.
bool preserve_; //!< Preserve timestamps flag.
bool timestamp_; //!< Rename also sets the file timestamp.
bool timestampOnly_; //!< Rename only sets the file timestamp.
FileExistsPolicy fileExistsPolicy_; //!< What to do if file to rename exists.
bool adjust_; //!< Adjustment flag.
PrintMode printMode_; //!< Print mode.
unsigned long printItems_; //!< Print items.
//! %Action (integer rather than TaskType to avoid dependency).
int action_;
int target_; //!< What common target to process.
@ -159,17 +177,20 @@ private:
@brief Default constructor. Note that optstring_ is initialized here.
The c'tor is private to force instantiation through instance().
*/
Params() : optstring_(":hVvfktTFa:r:p:d:e:i:c:m:M:l:S:"),
Params() : optstring_(":hVvfbuktTFa:r:p:P:d:e:i:c:m:M:l:S:"),
help_(false),
version_(false),
verbose_(false),
force_(false),
binary_(false),
unknown_(false),
preserve_(false),
timestamp_(false),
timestampOnly_(false),
fileExistsPolicy_(askPolicy),
adjust_(false),
printMode_(pmSummary),
printItems_(0),
action_(0),
target_(ctExif|ctIptc|ctComment),
adjustment_(0),
@ -184,6 +205,7 @@ private:
int evalRename(int opt, const std::string& optarg);
int evalAdjust(const std::string& optarg);
int evalPrint(const std::string& optarg);
int evalPrintCols(const std::string& optarg);
int evalDelete(const std::string& optarg);
int evalExtract(const std::string& optarg);
int evalInsert(const std::string& optarg);

View File

@ -4,9 +4,9 @@ Added key "Exif.Image.PrimaryChromaticities", value "1/2 1/3 2/3 3/4"
Modified key "Exif.Image.PrimaryChromaticities", new value "2000:12:31 23:59:59"
Modified key "Exif.Image.PrimaryChromaticities", new value "1/2 1/3 88/77 3/4"
Deleted key "Exif.Image.PrimaryChromaticities"
0x0110 IFD0 Model Ascii 7 Test 1
0x0115 IFD0 SamplesPerPixel Short 1 162
0x011a IFD0 XResolution SLong 1 -2
0x011b IFD0 YResolution SRational 1 -2/3
0x8769 IFD0 ExifTag Long 1 89
0x9003 Exif DateTimeOriginal Ascii 20 2000:12:31 23:59:59
0x0110 Image Model Ascii 7 Test 1
0x0115 Image SamplesPerPixel Short 1 162
0x011a Image XResolution SLong 1 -2
0x011b Image YResolution SRational 1 -2/3
0x8769 Image ExifTag Long 1 89
0x9003 Photo DateTimeOriginal Ascii 20 2000:12:31 23:59:59

File diff suppressed because one or more lines are too long

View File

@ -14,49 +14,49 @@ File 1/1: exiv2-empty.jpg
Iptc.Application2.Credit String 12 mee too! (1)
Iptc.Application2.Headline String 8 Headline
File 1/2: exiv2-empty.jpg
exiv2-empty.jpg Exif.Image.DateTime Ascii 19 Zwanzig nach fuenf
exiv2-empty.jpg Exif.Image.Artist Ascii 17 Vincent van Gogh
exiv2-empty.jpg Exif.Image.WhitePoint Short 5 32 12 4 5 6
exiv2-empty.jpg Exif.Image.ExifTag Long 1 108
exiv2-empty.jpg Exif.Photo.UserComment Undefined 37 This is an ASCII Exif comment
exiv2-empty.jpg Exif.Image.DateTime Ascii 19 Zwanzig nach fuenf
exiv2-empty.jpg Exif.Image.Artist Ascii 17 Vincent van Gogh
exiv2-empty.jpg Exif.Image.WhitePoint Short 5 32 12 4 5 6
exiv2-empty.jpg Exif.Image.ExifTag Long 1 108
exiv2-empty.jpg Exif.Photo.UserComment Undefined 37 This is an ASCII Exif comment
File 2/2: exiv2-gc.jpg
exiv2-gc.jpg Exif.Image.ImageDescription Ascii 18 Exif JPEG
exiv2-gc.jpg Exif.Image.Make Ascii 8 Camera
exiv2-gc.jpg Exif.Image.Model Ascii 16 DC-4300
exiv2-gc.jpg Exif.Image.Orientation Short 1 top, left
exiv2-gc.jpg Exif.Image.XResolution Rational 1 72
exiv2-gc.jpg Exif.Image.YResolution Rational 1 72
exiv2-gc.jpg Exif.Image.ResolutionUnit Short 1 inch
exiv2-gc.jpg Exif.Image.Software Ascii 22 Exiv2 utility!!
exiv2-gc.jpg Exif.Image.DateTime Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Image.YCbCrPositioning Short 1 Co-sited
exiv2-gc.jpg Exif.Image.ExifTag Long 1 6480
exiv2-gc.jpg Exif.Photo.ExposureTime Rational 1 1/95 s
exiv2-gc.jpg Exif.Photo.FNumber Rational 1 F9.1
exiv2-gc.jpg Exif.Photo.ExposureProgram Short 1 Landscape mode
exiv2-gc.jpg Exif.Photo.ISOSpeedRatings Short 1 100
exiv2-gc.jpg Exif.Photo.ExifVersion Undefined 4 48 50 49 48
exiv2-gc.jpg Exif.Photo.DateTimeOriginal Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Photo.DateTimeDigitized Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Photo.ComponentsConfiguration Undefined 4 YCbCr
exiv2-gc.jpg Exif.Photo.ShutterSpeedValue SRational 1 1/97 s
exiv2-gc.jpg Exif.Photo.ApertureValue Rational 1 F9.2
exiv2-gc.jpg Exif.Photo.ExposureBiasValue SRational 1 0
exiv2-gc.jpg Exif.Photo.MaxApertureValue Rational 1 F2.9
exiv2-gc.jpg Exif.Photo.MeteringMode Short 1 Matrix
exiv2-gc.jpg Exif.Photo.LightSource Short 1 Unknown
exiv2-gc.jpg Exif.Photo.Flash Short 1 No
exiv2-gc.jpg Exif.Photo.FlashpixVersion Undefined 4 48 49 48 48
exiv2-gc.jpg Exif.Photo.ColorSpace Short 1 sRGB
exiv2-gc.jpg Exif.Photo.PixelXDimension Long 1 1600
exiv2-gc.jpg Exif.Photo.PixelYDimension Long 1 2400
exiv2-gc.jpg Exif.Photo.InteroperabilityTag Long 1 6738
exiv2-gc.jpg Exif.Photo.FileSource Undefined 1 Digital still camera
exiv2-gc.jpg Exif.Iop.InteroperabilityIndex Ascii 4 R98
exiv2-gc.jpg Exif.Iop.InteroperabilityVersion Undefined 4 48 49 48 48
exiv2-gc.jpg Exif.Thumbnail.ImageWidth Long 1 133
exiv2-gc.jpg Exif.Thumbnail.ImageLength Long 1 200
exiv2-gc.jpg Exif.Thumbnail.Compression Short 1 JPEG
exiv2-gc.jpg Exif.Thumbnail.Orientation Short 1 top, left
exiv2-gc.jpg Exif.Thumbnail.JPEGInterchangeFormat Long 1 0
exiv2-gc.jpg Exif.Thumbnail.JPEGInterchangeFormatLength Long 1 6144
exiv2-gc.jpg Exif.Image.ImageDescription Ascii 18 Exif JPEG
exiv2-gc.jpg Exif.Image.Make Ascii 8 Camera
exiv2-gc.jpg Exif.Image.Model Ascii 16 DC-4300
exiv2-gc.jpg Exif.Image.Orientation Short 1 top, left
exiv2-gc.jpg Exif.Image.XResolution Rational 1 72
exiv2-gc.jpg Exif.Image.YResolution Rational 1 72
exiv2-gc.jpg Exif.Image.ResolutionUnit Short 1 inch
exiv2-gc.jpg Exif.Image.Software Ascii 22 Exiv2 utility!!
exiv2-gc.jpg Exif.Image.DateTime Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Image.YCbCrPositioning Short 1 Co-sited
exiv2-gc.jpg Exif.Image.ExifTag Long 1 6480
exiv2-gc.jpg Exif.Photo.ExposureTime Rational 1 1/95 s
exiv2-gc.jpg Exif.Photo.FNumber Rational 1 F9.1
exiv2-gc.jpg Exif.Photo.ExposureProgram Short 1 Landscape mode
exiv2-gc.jpg Exif.Photo.ISOSpeedRatings Short 1 100
exiv2-gc.jpg Exif.Photo.ExifVersion Undefined 4 48 50 49 48
exiv2-gc.jpg Exif.Photo.DateTimeOriginal Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Photo.DateTimeDigitized Ascii 20 2004:06:08 16:04:50
exiv2-gc.jpg Exif.Photo.ComponentsConfiguration Undefined 4 YCbCr
exiv2-gc.jpg Exif.Photo.ShutterSpeedValue SRational 1 1/97 s
exiv2-gc.jpg Exif.Photo.ApertureValue Rational 1 F9.2
exiv2-gc.jpg Exif.Photo.ExposureBiasValue SRational 1 0
exiv2-gc.jpg Exif.Photo.MaxApertureValue Rational 1 F2.9
exiv2-gc.jpg Exif.Photo.MeteringMode Short 1 Matrix
exiv2-gc.jpg Exif.Photo.LightSource Short 1 Unknown
exiv2-gc.jpg Exif.Photo.Flash Short 1 No
exiv2-gc.jpg Exif.Photo.FlashpixVersion Undefined 4 48 49 48 48
exiv2-gc.jpg Exif.Photo.ColorSpace Short 1 sRGB
exiv2-gc.jpg Exif.Photo.PixelXDimension Long 1 1600
exiv2-gc.jpg Exif.Photo.PixelYDimension Long 1 2400
exiv2-gc.jpg Exif.Photo.InteroperabilityTag Long 1 6738
exiv2-gc.jpg Exif.Photo.FileSource Undefined 1 Digital still camera
exiv2-gc.jpg Exif.Iop.InteroperabilityIndex Ascii 4 R98
exiv2-gc.jpg Exif.Iop.InteroperabilityVersion Undefined 4 48 49 48 48
exiv2-gc.jpg Exif.Thumbnail.ImageWidth Long 1 133
exiv2-gc.jpg Exif.Thumbnail.ImageLength Long 1 200
exiv2-gc.jpg Exif.Thumbnail.Compression Short 1 JPEG
exiv2-gc.jpg Exif.Thumbnail.Orientation Short 1 top, left
exiv2-gc.jpg Exif.Thumbnail.JPEGInterchangeFormat Long 1 0
exiv2-gc.jpg Exif.Thumbnail.JPEGInterchangeFormatLength Long 1 6144