ExifData::const_iterator isoSpeed(const ExifData& ed) { static const char* keys[] = { "Exif.Photo.ISOSpeedRatings", "Exif.Image.ISOSpeedRatings", "Exif.CanonSi.ISOSpeed", "Exif.CanonCs.ISOSpeed", "Exif.Nikon1.ISOSpeed", "Exif.Nikon2.ISOSpeed", "Exif.Nikon3.ISOSpeed", "Exif.NikonIi.ISO", "Exif.NikonIi.ISO2", "Exif.MinoltaCsNew.ISOSetting", "Exif.MinoltaCsOld.ISOSetting", "Exif.MinoltaCs5D.ISOSpeed", "Exif.MinoltaCs7D.ISOSpeed", "Exif.Sony1Cs.ISOSetting", "Exif.Sony2Cs.ISOSetting", "Exif.Sony1Cs2.ISOSetting", "Exif.Sony2Cs2.ISOSetting", "Exif.Sony1MltCsA100.ISOSetting", "Exif.Pentax.ISO", "Exif.PentaxDng.ISO", "Exif.Olympus.ISOSpeed", "Exif.Samsung2.ISO", "Exif.Casio.ISO", "Exif.Casio2.ISO", "Exif.Casio2.ISOSpeed" }; // Find the first ISO value which is not "0" const int cnt = EXV_COUNTOF(keys); ExifData::const_iterator md = ed.end(); for (int idx = 0; idx < cnt; ) { md = findMetadatum(ed, keys + idx, cnt - idx); if (md == ed.end()) break; std::ostringstream os; md->write(os, &ed); bool ok = false; long v = parseLong(os.str(), ok); if (ok && v != 0) break; while (strcmp(keys[idx++], md->key().c_str()) != 0 && idx < cnt) {} md = ed.end(); } return md; }