From 34f10994fbffa91b7f4457287b57fc02406bd2e7 Mon Sep 17 00:00:00 2001 From: clanmills Date: Sat, 24 Aug 2019 16:25:57 +0100 Subject: [PATCH] fix 987: Added options all and ALL to samples/taglist --- README-SAMPLES.md | 51 +++++++++++++++++++++++++++--- samples/taglist.cpp | 76 +++++++++++++++++++++++++-------------------- 2 files changed, 89 insertions(+), 38 deletions(-) diff --git a/README-SAMPLES.md b/README-SAMPLES.md index 6e2015c9..99391f42 100644 --- a/README-SAMPLES.md +++ b/README-SAMPLES.md @@ -482,7 +482,13 @@ Test conversions from string to long, float and Rational types. #### taglist ``` -Usage: taglist [--group name|Groups|Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus|Panasonic|Pentax|Sigma|Sony|Iptc|dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc] +$ taglist --help +Usage: taglist [--help] + [--group name| + Groups|Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus| + Panasonic|Pentax|Sigma|Sony|Iptc| + dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc|all|ALL + ] Print Exif tags, MakerNote tags, or Iptc datasets ``` @@ -494,7 +500,7 @@ The data from this program is formatted as HTML on the web-site. https://exiv2. For example, to show the binary definition of Group `Nikon3`: ``` -1516 rmills@rmillsmbp:~/gnu/github/exiv2/0.27-maintenance $ taglist Nikon3 +$ taglist Nikon3 Version, 1, 0x0001, Nikon3, Exif.Nikon3.Version, Undefined, Nikon Makernote version ISOSpeed, 2, 0x0002, Nikon3, Exif.Nikon3.ISOSpeed, Short, ISO speed setting ColorMode, 3, 0x0003, Nikon3, Exif.Nikon3.ColorMode, Ascii, Color mode @@ -511,15 +517,52 @@ We can see those tags being used: ``` $ exiv2 -pa --grep Nikon3 http://clanmills.com/Stonehenge.jpg -1519 rmills@rmillsmbp:~/gnu/github/exiv2/0.27-maintenance $ exiv2 -pa --grep Nikon3 http://clanmills.com/Stonehenge.jpg Exif.Nikon3.Version Undefined 4 2.11 Exif.Nikon3.ISOSpeed Short 2 200 -1520 rmills@rmillsmbp:~/gnu/github/exiv2/0.27-maintenance $ ... ``` This information is formatted (search Nikon (format 3) MakerNote Tags): [https://exiv2.org/tags-nikon.html](https://exiv2.org/tags-nikon.html) +#### taglist all + +These options are provided to list every Exif tag known to Exiv2. The option `all` prints Group.Name for every tag. The option `ALL` print Group.Name followed by the TagInfo for that tag. For example: + +```bash +$ taglist all | grep ISOSpeed$ +Photo.ISOSpeed +PanasonicRaw.ISOSpeed +CanonCs.ISOSpeed +CanonSi.ISOSpeed +Casio2.ISOSpeed +MinoltaCs5D.ISOSpeed +MinoltaCs7D.ISOSpeed +Nikon1.ISOSpeed +Nikon2.ISOSpeed +Nikon3.ISOSpeed +Olympus.ISOSpeed +Olympus2.ISOSpeed +``` + +```bash +$ taglist ALL | grep ISOSpeed, +Photo.ISOSpeed, 34867, 0x8833, Photo, Exif.Photo.ISOSpeed, Long, This tag indicates the ISO speed value of a camera or input device that is defined in ISO 12232. When recording this tag, the PhotographicSensitivity and SensitivityType tags shall also be recorded. +PanasonicRaw.ISOSpeed, 23, 0x0017, PanasonicRaw, Exif.PanasonicRaw.ISOSpeed, Short, ISO speed setting +CanonCs.ISOSpeed, 16, 0x0010, CanonCs, Exif.CanonCs.ISOSpeed, SShort, ISO speed setting +CanonSi.ISOSpeed, 2, 0x0002, CanonSi, Exif.CanonSi.ISOSpeed, Short, ISO speed used +Casio2.ISOSpeed, 20, 0x0014, Casio2, Exif.Casio2.ISOSpeed, Short, ISO Speed +MinoltaCs5D.ISOSpeed, 38, 0x0026, MinoltaCs5D, Exif.MinoltaCs5D.ISOSpeed, Short, ISO speed setting +MinoltaCs7D.ISOSpeed, 28, 0x001c, MinoltaCs7D, Exif.MinoltaCs7D.ISOSpeed, Short, ISO speed setting +Nikon1.ISOSpeed, 2, 0x0002, Nikon1, Exif.Nikon1.ISOSpeed, Short, ISO speed setting +Nikon2.ISOSpeed, 6, 0x0006, Nikon2, Exif.Nikon2.ISOSpeed, Short, ISO speed setting +Nikon3.ISOSpeed, 2, 0x0002, Nikon3, Exif.Nikon3.ISOSpeed, Short, ISO speed setting +Olympus.ISOSpeed, 4097, 0x1001, Olympus, Exif.Olympus.ISOSpeed, SRational, ISO speed value +Olympus2.ISOSpeed, 4097, 0x1001, Olympus, Exif.Olympus.ISOSpeed, SRational, ISO speed value +Sony1MltCs7D.ISOSpeed, 28, 0x001c, MinoltaCs7D, Exif.MinoltaCs7D.ISOSpeed, Short, ISO speed setting +``` + + + [Sample](#TOC1) Programs [Test](#TOC2) Programs
diff --git a/samples/taglist.cpp b/samples/taglist.cpp index 88dce169..bb87ee9a 100644 --- a/samples/taglist.cpp +++ b/samples/taglist.cpp @@ -12,42 +12,27 @@ #include #include +#include using namespace Exiv2; int main(int argc, char* argv[]) { + int rc = 0; + std::ostringstream out; try { - int rc = 0; + bool bHelp = false; switch (argc) { case 2: { std::string item(argv[1]); + if ( item == "--help" ) { + bHelp = true; + break; + } + if (item == "Groups") { - /* - https://cgit.kde.org/digikam.git/tree/core/libs/dmetadata/metaengine_exif.cpp#n1077 - const Exiv2::GroupInfo* gi = Exiv2::ExifTags::groupList(); - - while (gi->tagList_ != 0) - { - // NOTE: See BUG #375809 : MPF tags = exception Exiv2 0.26 - - if (QLatin1String(gi->ifdName_) != QLatin1String("Makernote")) - { - Exiv2::TagListFct tl = gi->tagList_; - const Exiv2::TagInfo* ti = tl(); - - while (ti->tag_ != 0xFFFF) - { - tags << ti; - ++ti; - } - } - - ++gi; - } - */ const GroupInfo* groupList = ExifTags::groupList(); if (groupList) { while (groupList->tagList_) { @@ -58,6 +43,26 @@ int main(int argc, char* argv[]) break; } + if (item == "all" || item == "ALL" ) { + const GroupInfo* groupList = ExifTags::groupList(); + if (groupList) { + while (groupList->tagList_) { + std::ostringstream tags; + ExifTags::taglist(tags,groupList->groupName_); + // https://en.cppreference.com/w/cpp/string/basic_string/getline + std::istringstream input(tags.str()) ; + for (std::string line,comma(","); std::getline(input, line); ) { + std::cout << groupList->groupName_ << "." + << (item == "all" ? line.substr(0,line.find(comma)) : line) + << std::endl; + } + groupList++; + } + } + break; + } + + if (item == "Exif") { ExifTags::taglist(std::cout); break; @@ -78,6 +83,7 @@ int main(int argc, char* argv[]) } catch (const AnyError&) { rc = 2; } + std::cerr << "Unexpected argument " << argv[1] << std::endl; break; } @@ -120,20 +126,22 @@ int main(int argc, char* argv[]) default: rc = 1; - break; + break; } - if (rc) { - std::cout << "Usage: " << argv[0] - << " [--group " - "name|Groups|Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus|" - "Panasonic|Pentax|Sigma|Sony|Iptc" - << "|dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc]\n" - << "Print Exif tags, MakerNote tags, or Iptc datasets\n"; + if (rc || bHelp) { + std::cout << "Usage: taglist [--help]" << std::endl + << " [--group name|" << std::endl + << " Groups|Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus|" << std::endl + << " Panasonic|Pentax|Sigma|Sony|Iptc|" << std::endl + << " dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc|all|ALL" << std::endl + << " ]" << std::endl + << "Print Exif tags, MakerNote tags, or Iptc datasets" << std::endl + ; } - return rc; } catch (AnyError& e) { std::cout << "Caught Exiv2 exception '" << e << "'\n"; - return 1; + rc = 1 ; } + return rc; }