Implemented print modes, part 2

v0.27.3
Andreas Huggel 22 years ago
parent 28295c5d80
commit 04eb1f992b

@ -20,13 +20,13 @@
*/ */
/* /*
File: actions.cpp File: actions.cpp
Version: $Name: $ $Revision: 1.5 $ Version: $Name: $ $Revision: 1.6 $
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net> Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
History: 08-Dec-03, ahu: created History: 08-Dec-03, ahu: created
*/ */
// ***************************************************************************** // *****************************************************************************
#include "rcsid.hpp" #include "rcsid.hpp"
EXIV2_RCSID("@(#) $Name: $ $Revision: 1.5 $ $RCSfile: actions.cpp,v $") EXIV2_RCSID("@(#) $Name: $ $Revision: 1.6 $ $RCSfile: actions.cpp,v $")
// ***************************************************************************** // *****************************************************************************
// included header files // included header files
@ -44,6 +44,7 @@ EXIV2_RCSID("@(#) $Name: $ $Revision: 1.5 $ $RCSfile: actions.cpp,v $")
#include <cstring> #include <cstring>
#include <cstdio> #include <cstdio>
#include <ctime> #include <ctime>
#include <cmath>
// ***************************************************************************** // *****************************************************************************
// local declarations // local declarations
@ -115,6 +116,7 @@ namespace Action {
int Print::run(const std::string& path) int Print::run(const std::string& path)
try { try {
path_ = path;
Exif::ExifData exifData; Exif::ExifData exifData;
int rc = exifData.read(path); int rc = exifData.read(path);
if (rc) { if (rc) {
@ -138,17 +140,61 @@ namespace Action {
void Print::printSummary(const Exif::ExifData& exifData) void Print::printSummary(const Exif::ExifData& exifData)
{ {
align_ = 15;
std::cout << std::setw(align_) << std::setfill(' ') << std::left
<< "Filename" << ": " << path_ << "\n";
printTag(exifData, "Image.OtherTags.Make", "Camera make"); printTag(exifData, "Image.OtherTags.Make", "Camera make");
printTag(exifData, "Image.OtherTags.Model", "Camera model"); printTag(exifData, "Image.OtherTags.Model", "Camera model");
printTag(exifData, "Image.DateTime.DateTimeOriginal", "Image Timestamp"); printTag(exifData, "Image.DateTime.DateTimeOriginal", "Image Timestamp");
printTag(exifData, "Image.CaptureConditions.ExposureTime", "Exposure time"); Exif::ExifData::const_iterator md;
printTag(exifData, "Image.CaptureConditions.FNumber", "Aperture"); // Exposure time: Try ExposureTime, failing that, try ShutterSpeedValue
std::ostringstream exposure;
md = exifData.findKey("Image.CaptureConditions.ExposureTime");
if (md != exifData.end()) {
exposure << *md;
}
else {
md = exifData.findKey("Image.CaptureConditions.ShutterSpeedValue");
if (md != exifData.end()) {
float f = exp2f(md->toFloat()) + 0.5;
if (f > 1) {
exposure << "1/" << static_cast<long>(f) << " s";
}
else {
exposure << static_cast<long>(1/f) << " s";
}
}
}
if (md != exifData.end()) {
std::cout << std::setw(align_) << std::setfill(' ') << std::left
<< "Exposure time" << ": " << exposure.str() << "\n";
}
// Aperture, get if from FNumber and, failing that, try ApertureValue
std::ostringstream aperture;
md = exifData.findKey("Image.CaptureConditions.FNumber");
if (md != exifData.end()) {
aperture << *md;
}
else {
md = exifData.findKey("Image.CaptureConditions.ApertureValue");
if (md != exifData.end()) {
aperture << std::fixed << std::setprecision(1)
<< "f/" << exp2f(md->toFloat()/2);
}
}
if (md != exifData.end()) {
std::cout << std::setw(align_) << std::setfill(' ') << std::left
<< "Aperture" << ": " << aperture.str() << "\n";
}
printTag(exifData, "Image.CaptureConditions.Flash", "Flash"); printTag(exifData, "Image.CaptureConditions.Flash", "Flash");
printTag(exifData, "Image.CaptureConditions.ISOSpeedRatings", "ISO");
printTag(exifData, "Image.CaptureConditions.ExposureProgram", "Program");
printTag(exifData, "Image.CaptureConditions.FocalLength", "Focal length"); printTag(exifData, "Image.CaptureConditions.FocalLength", "Focal length");
printTag(exifData, "Image.CaptureConditions.MeteringMode", "Metering mode"); printTag(exifData, "Image.CaptureConditions.MeteringMode", "Metering mode");
// Todo: Add size of IFD1 to thumbnail data size // Todo: Add size of IFD1 to thumbnail data size
std::cout << std::setw(15) << std::setfill(' ') << std::left std::cout << std::setw(align_) << std::setfill(' ') << std::left
<< "Thumbnail" << ": "; << "Thumbnail" << ": ";
switch (exifData.thumbnailType()) { switch (exifData.thumbnailType()) {
case Exif::Thumbnail::none: std::cout << "None\n"; break; case Exif::Thumbnail::none: std::cout << "None\n"; break;
@ -159,21 +205,24 @@ namespace Action {
std::cout << "TIFF, " << exifData.thumbnailSize() << " Bytes\n"; std::cout << "TIFF, " << exifData.thumbnailSize() << " Bytes\n";
break; break;
} }
std::cout << "\n";
} // Print::printSummary } // Print::printSummary
void Print::printTag(const Exif::ExifData& exifData, int Print::printTag(const Exif::ExifData& exifData,
const std::string& key, const std::string& key,
const std::string& label) const std::string& label)
{ {
int rc = 0;
Exif::ExifData::const_iterator md = exifData.findKey(key); Exif::ExifData::const_iterator md = exifData.findKey(key);
if (md != exifData.end()) { if (md != exifData.end()) {
std::cout << std::setw(15) << std::setfill(' ') << std::left std::cout << std::setw(align_) << std::setfill(' ') << std::left
<< label << ": " << *md << "\n"; << label << ": " << *md << "\n";
rc = 1;
} }
return rc;
} // Print::printTag } // Print::printTag
void Print::printInterpreted(const Exif::ExifData& exifData) void Print::printInterpreted(const Exif::ExifData& exifData)
{ {
Exif::ExifData::const_iterator md; Exif::ExifData::const_iterator md;

@ -22,7 +22,7 @@
@file actions.hpp @file actions.hpp
@brief Implements base class Task, TaskFactory and the various supported @brief Implements base class Task, TaskFactory and the various supported
actions (derived from Task). actions (derived from Task).
@version $Name: $ $Revision: 1.3 $ @version $Name: $ $Revision: 1.4 $
@author Andreas Huggel (ahu) @author Andreas Huggel (ahu)
<a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a> <a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a>
@date 11-Dec-03, ahu: created @date 11-Dec-03, ahu: created
@ -144,6 +144,7 @@ namespace Action {
//! %Print the %Exif (or other metadata) of a file to stdout //! %Print the %Exif (or other metadata) of a file to stdout
class Print : public Task { class Print : public Task {
public: public:
virtual ~Print() {}
virtual int run(const std::string& path); virtual int run(const std::string& path);
typedef std::auto_ptr<Print> AutoPtr; typedef std::auto_ptr<Print> AutoPtr;
AutoPtr clone() const; AutoPtr clone() const;
@ -156,13 +157,19 @@ namespace Action {
void printValues(const Exif::ExifData& exifData); void printValues(const Exif::ExifData& exifData);
//! Print %Exif information in hexdump format //! Print %Exif information in hexdump format
void printHexdump(const Exif::ExifData& exifData); void printHexdump(const Exif::ExifData& exifData);
//! Print one summary line with a label and requested data /*!
void printTag(const Exif::ExifData& exifData, @brief Print one summary line with a label and requested data.
Return 1 if a line was written, 0 if the key was not found.
*/
int printTag(const Exif::ExifData& exifData,
const std::string& key, const std::string& key,
const std::string& label); const std::string& label);
private: private:
virtual Task* clone_() const; virtual Task* clone_() const;
std::string path_;
int align_; // for the alignment of the summary output
}; };
/*! /*!

Loading…
Cancel
Save