[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:35:55 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=ffa409c
The following commit has been merged in the master branch:
commit ffa409cb781e1cd07568704662a81f021892ca54
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Thu Jan 15 07:52:19 2004 +0000
Added more tag descriptions and better handling thereof
---
src/Makefile | 4 +-
src/exif.cc | 99 +++-----------------
src/exif.h | 97 +++++++++-----------
src/exiftest.cc | 28 +++++-
src/tags.cc | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/tags.h | 108 ++++++++++++++++++++++
6 files changed, 470 insertions(+), 141 deletions(-)
diff --git a/src/Makefile b/src/Makefile
index dfa0268..1ac9829 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -8,7 +8,7 @@
#
# RCS information
# $Name: $
-# $Revision: 1.1 $
+# $Revision: 1.2 $
#
# Description:
# Do NOT change this file! All system specific settings and configs
@@ -40,7 +40,7 @@ include $(top_srcdir)/config.mk
CCHDR =
# Add library C++ source files to this list
-CCSRC = exif.cc utils.cc
+CCSRC = exif.cc tags.cc utils.cc
# Add source files of applications to this list
BINSRC = exiftest.cc
diff --git a/src/exif.cc b/src/exif.cc
index b76b111..425b8f5 100644
--- a/src/exif.cc
+++ b/src/exif.cc
@@ -1,10 +1,9 @@
// ***************************************************************** -*- C++ -*-
/*
* Copyright (c) 2004 Andreas Huggel
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.ibm.com/developerworks/oss/CPLv1.0.htm
+ *
+ * Todo: Insert license blabla here
+ *
*/
/*
Author(s): Andreas Huggel (ahu)
@@ -13,13 +12,12 @@
RCS information
$Name: $
- $Revision: 1.1 $
+ $Revision: 1.2 $
*/
// *****************************************************************************
// included header files
#include "exif.h"
-
-// + PMT includes
+#include "tags.h"
// + standard includes
#include <iostream>
@@ -167,79 +165,9 @@ namespace Exif {
ul2Data(buf+4, offset_, byteOrder_);
}
- Format::Format(uint16 type, const std::string& name, long size)
- : type_(type), name_(name), size_(size)
- {
- }
-
- //! Lookup list of IFD tag data formats and their properties
- static const Format tagDataFormat[] = {
- Format( 0, "invalid", 0),
- Format( 1, "unsigned byte", 1),
- Format( 2, "ascii strings", 1),
- Format( 3, "unsigned short", 2),
- Format( 4, "unsigned long", 4),
- Format( 5, "unsigned rational", 8),
- Format( 6, "signed byte", 1),
- Format( 7, "undefined", 1),
- Format( 8, "signed short", 2),
- Format( 9, "signed long", 4),
- Format(10, "signed rational", 8),
- Format(11, "single float", 4),
- Format(12, "double float", 8)
- };
-
- TagInfo::TagInfo(
- uint16 tag,
- const std::string& fieldName,
- const std::string& tagName,
- IfdId ifdId,
- TagSection tagSection
- )
- : tag_(tag), fieldName_(fieldName), tagName_(tagName),
- ifdId_(ifdId), tagSection_(tagSection)
- {
- }
-
- //! Lookup list with tags, their names and where they belong to
- static const TagInfo tagInfo[] = {
- TagInfo(0x0100, "ImageWidth", "Image width", ifd0, ifd0Tiff),
- TagInfo(0x0101, "ImageLength", "Image height", ifd0, ifd0Tiff),
- TagInfo(0x0102, "BitsPerSample", "Number of bits per component", ifd0, ifd0Tiff),
- TagInfo(0x0103, "Compression", "Compression scheme", ifd0, ifd0Tiff),
- TagInfo(0x0106, "PhotometricInterpretation", "Pixel composition", ifd0, ifd0Tiff),
- TagInfo(0x010e, "ImageDescription", "Image title", ifd0, ifd0Tiff),
- TagInfo(0x010f, "Make", "Manufacturer of image input equipment", ifd0, ifd0Tiff),
- TagInfo(0x0110, "Model", "Model of image input equipment", ifd0, ifd0Tiff),
- TagInfo(0x0111, "StripOffsets", "Image data location", ifd0, ifd0Tiff),
- TagInfo(0x0112, "Orientation", "Orientation of image", ifd0, ifd0Tiff),
- TagInfo(0x0115, "SamplesPerPixel", "Number of components", ifd0, ifd0Tiff),
- TagInfo(0x0116, "RowsPerStrip", "Number of rows per strip", ifd0, ifd0Tiff),
- TagInfo(0x0117, "StripByteCounts", "Bytes per compressed strip", ifd0, ifd0Tiff),
- TagInfo(0x011a, "XResolution", "Image resolution in width direction", ifd0, ifd0Tiff),
- TagInfo(0x011b, "YResolution", "Image resolution in height direction", ifd0, ifd0Tiff),
- TagInfo(0x011c, "PlanarConfiguration", "Image data arrangement", ifd0, ifd0Tiff),
- TagInfo(0x0128, "ResolutionUnit", "Unit of X and Y resolution", ifd0, ifd0Tiff),
- TagInfo(0x012d, "TransferFunction", "Transfer function", ifd0, ifd0Tiff),
- TagInfo(0x0131, "Software", "Software used", ifd0, ifd0Tiff),
- TagInfo(0x0132, "DateTime", "File change date and time", ifd0, ifd0Tiff),
- TagInfo(0x013b, "Artist", "Person who created the image", ifd0, ifd0Tiff),
- TagInfo(0x013e, "WhitePoint", "White point chromaticity", ifd0, ifd0Tiff),
- TagInfo(0x013f, "PrimaryChromaticities", "Chromaticities of primaries", ifd0, ifd0Tiff),
- TagInfo(0x0201, "JPEGInterchangeFormat", "Offset to JPEG SOI", ifd0, ifd0Tiff),
- TagInfo(0x0202, "JPEGInterchangeFormatLength", "Bytes of JPEG data", ifd0, ifd0Tiff),
- TagInfo(0x0211, "YCbCrCoefficients", "Color space transformation matrix coefficients", ifd0, ifd0Tiff),
- TagInfo(0x0212, "YCbCrSubSampling", "Subsampling ratio of Y to C", ifd0, ifd0Tiff),
- TagInfo(0x0213, "YCbCrPositioning", "Y and C positioning", ifd0, ifd0Tiff),
- TagInfo(0x0214, "ReferenceBlackWhite", "Pair of black and white reference values", ifd0, ifd0Tiff),
- TagInfo(0x8298, "Copyright", "Copyright holder", ifd0, ifd0Tiff),
- TagInfo(0x8769, "ExifTag", "Exif IFD Pointer", ifd0, ifd0Tiff),
- TagInfo(0x8825, "GPSTag", "GPSInfo IFD Pointer", ifd0, ifd0Tiff)
- };
-
Metadatum::Metadatum()
: tag_(0), type_(0), count_(0), offset_(0), size_(0),
- ifdId_(unknown), ifdIdx_(-1), data_(0)
+ ifdId_(IfdIdNotSet), ifdIdx_(-1), data_(0)
{
}
@@ -285,8 +213,8 @@ namespace Exif {
}
return *this;
- }
-
+ } // Metadatum::operator=
+
Ifd::Ifd(IfdId ifdId)
: ifdId_(ifdId), offset_(0), next_(0), size_(0)
{
@@ -298,6 +226,7 @@ namespace Exif {
int n = getUShort(buf, byteOrder);
long o = 2;
+ entries_.clear();
for (int i=0; i<n; ++i) {
Metadatum e;
e.ifdId_ = ifdId_;
@@ -307,7 +236,7 @@ namespace Exif {
e.count_ = getULong(buf+o+4, byteOrder);
// offset will be converted to a relative offset below
e.offset_ = getULong(buf+o+8, byteOrder);
- e.size_ = e.count_ * tagDataFormat[e.type_].size_;
+ e.size_ = e.count_ * e.typeSize();
// data_ is set later, see below
entries_.push_back(e);
o += 12;
@@ -356,7 +285,7 @@ namespace Exif {
int rc = 0;
Metadata::const_iterator pos;
Metadata::const_iterator end = entries_.end();
- pos = std::find_if(entries_.begin(), end, matchTag(tag));
+ pos = std::find_if(entries_.begin(), end, FindMetadatumByTag(tag));
if (pos != end) {
rc = dest.read(buf + pos->offset_, byteOrder, pos->offset_);
}
@@ -429,7 +358,7 @@ namespace Exif {
Metadata::const_iterator i = b;
for (; i != e; ++i) {
std::ostringstream offset;
- if (tagDataFormat[i->type_].size_ * i->count_ <= 4) {
+ if (i->typeSize() * i->count_ <= 4) {
// Minor cheat here: we use data_ instead of offset_ to avoid
// having to invoke ul2Data() which would require byte order.
offset << std::setw(2) << std::setfill('0') << std::hex
@@ -451,8 +380,8 @@ namespace Exif {
<< " 0x" << std::setw(4) << std::setfill('0') << std::hex
<< std::right << i->tag_
<< " " << std::setw(17) << std::setfill(' ')
- << std::left << tagDataFormat[i->type_].name_
- << " (" << std::dec << tagDataFormat[i->type_].size_ << ")"
+ << std::left << i->typeName()
+ << " (" << std::dec << i->typeSize() << ")"
<< " " << std::setw(6) << std::setfill(' ') << std::dec
<< std::right << i->count_
<< " " << offset.str()
diff --git a/src/exif.h b/src/exif.h
index ecc67d3..a631bb6 100644
--- a/src/exif.h
+++ b/src/exif.h
@@ -2,18 +2,13 @@
/*
* Copyright (c) 2004 Andreas Huggel. All rights reserved.
*
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file license-gpl.txt included in the
- * packaging of this file.
+ * Todo: Insert license blabla here
*
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/*!
@file exif.h
@brief Encoding and decoding of %Exif data
- @version $Name: $ $Revision: 1.1 $
+ @version $Name: $ $Revision: 1.2 $
@author Andreas Huggel (ahu)
@date 09-Jan-03, ahu: created
*/
@@ -22,10 +17,12 @@
// *****************************************************************************
// included header files
+#include "tags.h"
+
// + standard includes
#include <string>
#include <vector>
-#include <iostream>
+#include <iosfwd>
// *****************************************************************************
// namespace extensions
@@ -35,15 +32,6 @@ namespace Exif {
// *****************************************************************************
// type definitions
- //! 2 byte unsigned integer type.
- typedef unsigned short uint16;
- //! 4 byte unsigned integer type.
- typedef unsigned long uint32;
- //! 2 byte signed integer type.
- typedef short int16;
- //! 4 byte signed integer type.
- typedef long int32;
-
// *****************************************************************************
// class definitions
@@ -102,11 +90,11 @@ namespace Exif {
//! @name Accessors
//@{
//! Returns the size of the %Exif data buffer
- long sizeExifData() { return sizeExifData_; }
+ long sizeExifData() const { return sizeExifData_; }
//! Returns the offset of the %Exif data buffer from SOI
- long offsetExifData() { return offsetExifData_; }
+ long offsetExifData() const { return offsetExifData_; }
//! Returns a read-only pointer to the %Exif data buffer
- const char* exifData() { return exifData_; }
+ const char* exifData() const { return exifData_; }
//@}
private:
@@ -154,46 +142,25 @@ namespace Exif {
uint32 offset_;
}; // class TiffHeader
- //! Description of a format for a metadatum
- struct Format {
- //! Constructor
- Format(uint16 type, const std::string& name, long size);
- uint16 type_; //!< Format type id
- std::string name_; //!< Name of the format
- long size_; //!< Bytes per data entry
- }; // struct Format
-
- //! Type to specify the IFD to which a metadata belongs
- enum IfdId { unknown, ifd0, ifd1, exifIfd, gpsIfd, makerNoteIfd, exifIopIfd, ifd1IopIfd };
-
- enum TagSection { ifd0Tiff };
-
- struct TagInfo {
- //! Constructor
- TagInfo(
- uint16 tag,
- const std::string& fieldName,
- const std::string& tagName,
- IfdId ifdId,
- TagSection tagSection
- );
- uint16 tag_;
- std::string fieldName_;
- std::string tagName_;
- IfdId ifdId_;
- TagSection tagSection_;
- };
-
/*!
@brief Information related to one %Exif tag.
*/
- struct Metadatum {
+ class Metadatum {
+ public:
Metadatum(); //!< Constructor
~Metadatum(); //!< Destructor
Metadatum(const Metadatum& rhs); //!< Copy constructor
Metadatum& operator=(const Metadatum& rhs); //!< Assignment operator
+ //! Returns the name of the type
+ const char* tagName() const { return ExifTags::tagName(tag_, ifdId_); }
+ //! Returns the name of the type
+ const char* typeName() const { return ExifTags::typeName(type_); }
+ //! Returns the size in bytes of one element of this type
+ long typeSize() const { return ExifTags::typeSize(type_); }
+
+ public:
uint16 tag_; //!< Tag value
uint16 type_; //!< Type of the data
uint32 count_; //!< Number of components
@@ -204,11 +171,28 @@ namespace Exif {
int ifdIdx_; //!< Position in the IFD (-1: not set)
char* data_; //!< Pointer to the data
+
}; // struct Metadatum
//! Container type to hold all metadata
typedef std::vector<Metadatum> Metadata;
+ //! Unary predicate that matches a Metadatum with a given tag
+ class FindMetadatumByTag {
+ public:
+ //! Constructor, initializes the object with the tag to look for
+ FindMetadatumByTag(uint16 tag) : tag_(tag) {}
+ /*!
+ @brief Returns true if the tag of the argument metadatum is equal
+ to that of the object.
+ */
+ bool operator()(const Metadatum& metadatum) const
+ { return tag_ == metadatum.tag_; }
+
+ private:
+ uint16 tag_;
+ };
+
/*!
@brief Models an IFD (Image File Directory)
@@ -219,7 +203,7 @@ namespace Exif {
class Ifd {
public:
//! Constructor. Allows to set the IFD identifier.
- Ifd(IfdId ifdId =unknown);
+ Ifd(IfdId ifdId =IfdIdNotSet);
/*!
@brief Read a complete IFD and its data from a data buffer
@@ -269,7 +253,7 @@ namespace Exif {
@brief Print the IFD in human readable format to the given stream;
begin each line with prefix.
*/
- void print(std::ostream& os =std::cout, const std::string& prefix ="") const;
+ void print(std::ostream& os, const std::string& prefix ="") const;
//! @name Accessors
//@{
//! Offset of the IFD from SOI
@@ -336,6 +320,13 @@ namespace Exif {
//! Add Metadatum src to the Exif metadata
void add(const Metadatum& src);
+ //! Metadata iterator type (const)
+ typedef Metadata::const_iterator const_iterator;
+ //! Begin of the metadata
+ const_iterator begin() const { return metadata_.begin(); }
+ //! End of the metadata
+ const_iterator end() const { return metadata_.end(); }
+
private:
long offset_; // Original abs offset of the Exif data
TiffHeader tiffHeader_;
diff --git a/src/exiftest.cc b/src/exiftest.cc
index 0a476e8..9ddc04b 100644
--- a/src/exiftest.cc
+++ b/src/exiftest.cc
@@ -1,5 +1,6 @@
#include "exif.h"
#include <iostream>
+#include <iomanip>
int main(int argc, char* const argv[])
{
@@ -9,5 +10,30 @@ int main(int argc, char* const argv[])
}
Exif::ExifData exifData;
- return exifData.read(argv[1]);
+ int rc = exifData.read(argv[1]);
+
+ if (rc == 0) {
+
+ Exif::ExifData::const_iterator beg = exifData.begin();
+ Exif::ExifData::const_iterator end = exifData.end();
+ Exif::ExifData::const_iterator i = beg;
+ for (; i != end; ++i) {
+
+ std::cout << "0x"
+ << std::hex << std::setw(4) << std::setfill('0') << std::right
+ << i->tag_ << " "
+ << std::setw(27) << std::setfill(' ') << std::left
+ << i->tagName() << " "
+ << std::setw(17) << std::setfill(' ') << std::left
+ << i->typeName() << " "
+ << std::dec << std::setw(3) << std::setfill(' ') << std::right
+ << i->count_ << " "
+ << std::dec << std::setw(3) << std::setfill(' ') << std::right
+ << i->typeSize() * i->count_ << "
";
+
+ }
+ }
+
+ return rc;
+
}
diff --git a/src/tags.cc b/src/tags.cc
new file mode 100644
index 0000000..843793b
--- /dev/null
+++ b/src/tags.cc
@@ -0,0 +1,275 @@
+// ***************************************************************** -*- C++ -*-
+/*
+ * Copyright (c) 2004 Andreas Huggel
+ *
+ * Todo: Insert license blabla here
+ *
+ */
+/*
+ Author(s): Andreas Huggel (ahu)
+ History:
+ 15-Jan-04, ahu: created
+
+ RCS information
+ $Name: $
+ $Revision: 1.1 $
+ */
+// *****************************************************************************
+// included header files
+#include "tags.h"
+
+// + standard includes
+
+// *****************************************************************************
+// local declarations
+namespace {
+
+}
+
+// *****************************************************************************
+// class member definitions
+namespace Exif {
+
+ TagFormat::TagFormat(uint16 type, const char* name, long size)
+ : type_(type), name_(name), size_(size)
+ {
+ }
+
+ //! Lookup list of IFD tag data formats and their properties
+ const TagFormat ExifTags::tagFormat_[] = {
+ TagFormat( 0, "invalid", 0),
+ TagFormat( 1, "unsigned byte", 1),
+ TagFormat( 2, "ascii strings", 1),
+ TagFormat( 3, "unsigned short", 2),
+ TagFormat( 4, "unsigned long", 4),
+ TagFormat( 5, "unsigned rational", 8),
+ TagFormat( 6, "signed byte", 1),
+ TagFormat( 7, "undefined", 1),
+ TagFormat( 8, "signed short", 2),
+ TagFormat( 9, "signed long", 4),
+ TagFormat(10, "signed rational", 8),
+ TagFormat(11, "single float", 4),
+ TagFormat(12, "double float", 8)
+ };
+
+ TagInfo::TagInfo(
+ uint16 tag,
+ const char* name,
+ const char* desc,
+ IfdId ifdId,
+ TagSection section
+ )
+ : tag_(tag), name_(name), desc_(desc),
+ ifdId_(ifdId), section_(section)
+ {
+ }
+
+ //! Lookup list with tags, their names and where they belong to
+ const TagInfo ExifTags::tagInfo_[] = {
+ // Exif Interoperability IFD Tags
+ TagInfo(0x0001, "InteroperabilityIndex", "Interoperability Identification", exifIopIfd, exifIopIfdSection),
+ TagInfo(0x0002, "InteroperabilityVersion", "Interoperability version", exifIopIfd, exifIopIfdSection),
+ TagInfo(0x1000, "RelatedImageFileFormat", "File format of image file", exifIopIfd, exifIopIfdSection),
+ TagInfo(0x1001, "RelatedImageWidth", "Image width", exifIopIfd, exifIopIfdSection),
+ TagInfo(0x1002, "RelatedImageLength", "Image height", exifIopIfd, exifIopIfdSection),
+
+ // GPS Info Tags
+ TagInfo(0x0000, "GPSVersionID", "GPS tag version", gpsIfd, gpsIfdSection),
+ TagInfo(0x0001, "GPSLatitudeRef", "North or South Latitude", gpsIfd, gpsIfdSection),
+ TagInfo(0x0002, "GPSLatitude", "Latitude", gpsIfd, gpsIfdSection),
+ TagInfo(0x0003, "GPSLongitudeRef", "East or West Longitude", gpsIfd, gpsIfdSection),
+ TagInfo(0x0004, "GPSLongitude", "Longitude", gpsIfd, gpsIfdSection),
+ TagInfo(0x0005, "GPSAltitudeRef", "Altitude reference", gpsIfd, gpsIfdSection),
+ TagInfo(0x0006, "GPSAltitude", "Altitude", gpsIfd, gpsIfdSection),
+ TagInfo(0x0007, "GPSTimeStamp", "GPS time (atomic clock)", gpsIfd, gpsIfdSection),
+ TagInfo(0x0008, "GPSSatellites", "GPS satellites used for measurement", gpsIfd, gpsIfdSection),
+ TagInfo(0x0009, "GPSStatus", "GPS receiver status", gpsIfd, gpsIfdSection),
+ TagInfo(0x000a, "GPSMeasureMode", "GPS measurement mode", gpsIfd, gpsIfdSection),
+ TagInfo(0x000b, "GPSDOP", "Measurement precision", gpsIfd, gpsIfdSection),
+ TagInfo(0x000c, "GPSSpeedRef", "Speed unit", gpsIfd, gpsIfdSection),
+ TagInfo(0x000d, "GPSSpeed", "Speed of GPS receiver", gpsIfd, gpsIfdSection),
+ TagInfo(0x000e, "GPSTrackRef", "Reference for direction of movement", gpsIfd, gpsIfdSection),
+ TagInfo(0x000f, "GPSTrack", "Direction of movement", gpsIfd, gpsIfdSection),
+ TagInfo(0x0010, "GPSImgDirectionRef", "Reference for direction of image", gpsIfd, gpsIfdSection),
+ TagInfo(0x0011, "GPSImgDirection", "Direction of image", gpsIfd, gpsIfdSection),
+ TagInfo(0x0012, "GPSMapDatum", "Geodetic survey data used", gpsIfd, gpsIfdSection),
+ TagInfo(0x0013, "GPSDestLatitudeRef", "Reference for latitude of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0014, "GPSDestLatitude", "Latitude of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0015, "GPSDestLongitudeRef", "Reference for longitude of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0016, "GPSDestLongitude", "Longitude of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0017, "GPSDestBearingRef", "Reference for bearing of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0018, "GPSDestBearing", "Bearing of destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x0019, "GPSDestDistanceRef", "Reference for distance to destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x001a, "GPSDestDistance", "Distance to destination", gpsIfd, gpsIfdSection),
+ TagInfo(0x001b, "GPSProcessingMethod", "Name of GPS processing method", gpsIfd, gpsIfdSection),
+ TagInfo(0x001c, "GPSAreaInformation", "Name of GPS area", gpsIfd, gpsIfdSection),
+ TagInfo(0x001d, "GPSDateStamp", "GPS date", gpsIfd, gpsIfdSection),
+ TagInfo(0x001e, "GPSDifferential", "GPS differential correction", gpsIfd, gpsIfdSection),
+
+ // IFD0 Tags
+ TagInfo(0x0100, "ImageWidth", "Image width", ifd0, ifd0Tiff),
+ TagInfo(0x0101, "ImageLength", "Image height", ifd0, ifd0Tiff),
+ TagInfo(0x0102, "BitsPerSample", "Number of bits per component", ifd0, ifd0Tiff),
+ TagInfo(0x0103, "Compression", "Compression scheme", ifd0, ifd0Tiff),
+ TagInfo(0x0106, "PhotometricInterpretation", "Pixel composition", ifd0, ifd0Tiff),
+ TagInfo(0x010e, "ImageDescription", "Image title", ifd0, ifd0Tiff),
+ TagInfo(0x010f, "Make", "Manufacturer of image input equipment", ifd0, ifd0Tiff),
+ TagInfo(0x0110, "Model", "Model of image input equipment", ifd0, ifd0Tiff),
+ TagInfo(0x0111, "StripOffsets", "Image data location", ifd0, ifd0Tiff),
+ TagInfo(0x0112, "Orientation", "Orientation of image", ifd0, ifd0Tiff),
+ TagInfo(0x0115, "SamplesPerPixel", "Number of components", ifd0, ifd0Tiff),
+ TagInfo(0x0116, "RowsPerStrip", "Number of rows per strip", ifd0, ifd0Tiff),
+ TagInfo(0x0117, "StripByteCounts", "Bytes per compressed strip", ifd0, ifd0Tiff),
+ TagInfo(0x011a, "XResolution", "Image resolution in width direction", ifd0, ifd0Tiff),
+ TagInfo(0x011b, "YResolution", "Image resolution in height direction", ifd0, ifd0Tiff),
+ TagInfo(0x011c, "PlanarConfiguration", "Image data arrangement", ifd0, ifd0Tiff),
+ TagInfo(0x0128, "ResolutionUnit", "Unit of X and Y resolution", ifd0, ifd0Tiff),
+ TagInfo(0x012d, "TransferFunction", "Transfer function", ifd0, ifd0Tiff),
+ TagInfo(0x0131, "Software", "Software used", ifd0, ifd0Tiff),
+ TagInfo(0x0132, "DateTime", "File change date and time", ifd0, ifd0Tiff),
+ TagInfo(0x013b, "Artist", "Person who created the image", ifd0, ifd0Tiff),
+ TagInfo(0x013e, "WhitePoint", "White point chromaticity", ifd0, ifd0Tiff),
+ TagInfo(0x013f, "PrimaryChromaticities", "Chromaticities of primaries", ifd0, ifd0Tiff),
+ TagInfo(0x0201, "JPEGInterchangeFormat", "Offset to JPEG SOI", ifd0, ifd0Tiff),
+ TagInfo(0x0202, "JPEGInterchangeFormatLength", "Bytes of JPEG data", ifd0, ifd0Tiff),
+ TagInfo(0x0211, "YCbCrCoefficients", "Color space transformation matrix coefficients", ifd0, ifd0Tiff),
+ TagInfo(0x0212, "YCbCrSubSampling", "Subsampling ratio of Y to C", ifd0, ifd0Tiff),
+ TagInfo(0x0213, "YCbCrPositioning", "Y and C positioning", ifd0, ifd0Tiff),
+ TagInfo(0x0214, "ReferenceBlackWhite", "Pair of black and white reference values", ifd0, ifd0Tiff),
+ TagInfo(0x8298, "Copyright", "Copyright holder", ifd0, ifd0Tiff),
+ TagInfo(0x8769, "ExifTag", "Exif IFD Pointer", ifd0, ifd0Tiff),
+ TagInfo(0x8825, "GPSTag", "GPSInfo IFD Pointer", ifd0, ifd0Tiff),
+
+ // IFD1 Tags
+ TagInfo(0x0100, "ImageWidth", "Image width", ifd1, ifd1Section),
+ TagInfo(0x0101, "ImageLength", "Image height", ifd1, ifd1Section),
+ TagInfo(0x0102, "BitsPerSample", "Number of bits per component", ifd1, ifd1Section),
+ TagInfo(0x0103, "Compression", "Compression scheme", ifd1, ifd1Section),
+ TagInfo(0x0106, "PhotometricInterpretation", "Pixel composition", ifd1, ifd1Section),
+ TagInfo(0x010e, "ImageDescription", "Image title", ifd1, ifd1Section),
+ TagInfo(0x010f, "Make", "Manufacturer of image input equipment", ifd1, ifd1Section),
+ TagInfo(0x0110, "Model", "Model of image input equipment", ifd1, ifd1Section),
+ TagInfo(0x0111, "StripOffsets", "Image data location", ifd1, ifd1Section),
+ TagInfo(0x0112, "Orientation", "Orientation of image", ifd1, ifd1Section),
+ TagInfo(0x0115, "SamplesPerPixel", "Number of components", ifd1, ifd1Section),
+ TagInfo(0x0116, "RowsPerStrip", "Number of rows per strip", ifd1, ifd1Section),
+ TagInfo(0x0117, "StripByteCounts", "Bytes per compressed strip", ifd1, ifd1Section),
+ TagInfo(0x011a, "XResolution", "Image resolution in width direction", ifd1, ifd1Section),
+ TagInfo(0x011b, "YResolution", "Image resolution in height direction", ifd1, ifd1Section),
+ TagInfo(0x011c, "PlanarConfiguration", "Image data arrangement", ifd1, ifd1Section),
+ TagInfo(0x0128, "ResolutionUnit", "Unit of X and Y resolution", ifd1, ifd1Section),
+ TagInfo(0x012d, "TransferFunction", "Transfer function", ifd1, ifd1Section),
+ TagInfo(0x0131, "Software", "Software used", ifd1, ifd1Section),
+ TagInfo(0x0132, "DateTime", "File change date and time", ifd1, ifd1Section),
+ TagInfo(0x013b, "Artist", "Person who created the image", ifd1, ifd1Section),
+ TagInfo(0x013e, "WhitePoint", "White point chromaticity", ifd1, ifd1Section),
+ TagInfo(0x013f, "PrimaryChromaticities", "Chromaticities of primaries", ifd1, ifd1Section),
+ TagInfo(0x0201, "JPEGInterchangeFormat", "Offset to JPEG SOI", ifd1, ifd1Section),
+ TagInfo(0x0202, "JPEGInterchangeFormatLength", "Bytes of JPEG data", ifd1, ifd1Section),
+ TagInfo(0x0211, "YCbCrCoefficients", "Color space transformation matrix coefficients", ifd1, ifd1Section),
+ TagInfo(0x0212, "YCbCrSubSampling", "Subsampling ratio of Y to C", ifd1, ifd1Section),
+ TagInfo(0x0213, "YCbCrPositioning", "Y and C positioning", ifd1, ifd1Section),
+ TagInfo(0x0214, "ReferenceBlackWhite", "Pair of black and white reference values", ifd1, ifd1Section),
+ TagInfo(0x8298, "Copyright", "Copyright holder", ifd1, ifd1Section),
+ TagInfo(0x8769, "ExifTag", "Exif IFD Pointer", ifd1, ifd1Section),
+ TagInfo(0x8825, "GPSTag", "GPSInfo IFD Pointer", ifd1, ifd1Section),
+
+ // Exif IFD Tags
+ TagInfo(0x829a, "ExposureTime", "Exposure time", exifIfd, exifIfdSection),
+ TagInfo(0x829d, "FNumber", "F number", exifIfd, exifIfdSection),
+ TagInfo(0x8822, "ExposureProgram", "Exposure program", exifIfd, exifIfdSection),
+ TagInfo(0x8824, "SpectralSensitivity", "Spectral sensitivity", exifIfd, exifIfdSection),
+ TagInfo(0x8827, "ISOSpeedRatings", "ISO speed ratings", exifIfd, exifIfdSection),
+ TagInfo(0x8828, "OECF", "Optoelectric coefficient", exifIfd, exifIfdSection),
+ TagInfo(0x9000, "ExifVersion", "Exif Version", exifIfd, exifIfdSection),
+ TagInfo(0x9003, "DateTimeOriginal", "Date and time original image was generated", exifIfd, exifIfdSection),
+ TagInfo(0x9004, "DateTimeDigitized", "Date and time image was made digital data", exifIfd, exifIfdSection),
+ TagInfo(0x9101, "ComponentsConfiguration", "Meaning of each component", exifIfd, exifIfdSection),
+ TagInfo(0x9102, "CompressedBitsPerPixel", "Image compression mode", exifIfd, exifIfdSection),
+ TagInfo(0x9201, "ShutterSpeedValue", "Shutter speed", exifIfd, exifIfdSection),
+ TagInfo(0x9202, "ApertureValue", "Aperture", exifIfd, exifIfdSection),
+ TagInfo(0x9203, "BrightnessValue", "Brightness", exifIfd, exifIfdSection),
+ TagInfo(0x9204, "ExposureBiasValue", "Exposure bias", exifIfd, exifIfdSection),
+ TagInfo(0x9205, "MaxApertureValue", "Maximum lens aperture", exifIfd, exifIfdSection),
+ TagInfo(0x9206, "SubjectDistance", "Subject distance", exifIfd, exifIfdSection),
+ TagInfo(0x9207, "MeteringMode", "Metering mode", exifIfd, exifIfdSection),
+ TagInfo(0x9208, "LightSource", "Light source", exifIfd, exifIfdSection),
+ TagInfo(0x9209, "Flash", "Flash", exifIfd, exifIfdSection),
+ TagInfo(0x920a, "FocalLength", "Lens focal length", exifIfd, exifIfdSection),
+ TagInfo(0x9214, "SubjectArea", "Subject area", exifIfd, exifIfdSection),
+ TagInfo(0x927c, "MakerNote", "Manufacturer notes", exifIfd, exifIfdSection),
+ TagInfo(0x9286, "UserComment", "User comments", exifIfd, exifIfdSection),
+ TagInfo(0x9290, "SubSecTime", "DateTime subseconds", exifIfd, exifIfdSection),
+ TagInfo(0x9291, "SubSecTimeOriginal", "DateTimeOriginal subseconds", exifIfd, exifIfdSection),
+ TagInfo(0x9292, "SubSecTimeDigitized", "DateTimeDigitized subseconds", exifIfd, exifIfdSection),
+ TagInfo(0xa000, "FlashpixVersion", "Supported Flashpix version", exifIfd, exifIfdSection),
+ TagInfo(0xa001, "ColorSpace", "Color space information", exifIfd, exifIfdSection),
+ TagInfo(0xa002, "PixelXDimension", "Valid image width", exifIfd, exifIfdSection),
+ TagInfo(0xa003, "PixelYDimension", "Valid image height", exifIfd, exifIfdSection),
+ TagInfo(0xa004, "RelatedSoundFile", "Related audio file", exifIfd, exifIfdSection),
+ TagInfo(0xa005, "InteroperabilityTag", "Interoperability IFD Pointer", exifIfd, exifIfdSection),
+ TagInfo(0xa20b, "FlashEnergy", "Flash energy", exifIfd, exifIfdSection),
+ TagInfo(0xa20c, "SpatialFrequencyResponse", "Spatial frequency response", exifIfd, exifIfdSection),
+ TagInfo(0xa20e, "FocalPlaneXResolution", "Focal plane X resolution", exifIfd, exifIfdSection),
+ TagInfo(0xa20f, "FocalPlaneYResolution", "Focal plane Y resolution", exifIfd, exifIfdSection),
+ TagInfo(0xa210, "FocalPlaneResolutionUnit", "Focal plane resolution unit", exifIfd, exifIfdSection),
+ TagInfo(0xa214, "SubjectLocation", "Subject location", exifIfd, exifIfdSection),
+ TagInfo(0xa215, "ExposureIndex", "Exposure index", exifIfd, exifIfdSection),
+ TagInfo(0xa217, "SensingMethod", "Sensing method", exifIfd, exifIfdSection),
+ TagInfo(0xa300, "FileSource", "File source", exifIfd, exifIfdSection),
+ TagInfo(0xa301, "SceneType", "Scene type", exifIfd, exifIfdSection),
+ TagInfo(0xa302, "CFAPattern", "CFA pattern", exifIfd, exifIfdSection),
+ TagInfo(0xa401, "CustomRendered", "Custom image processing", exifIfd, exifIfdSection),
+ TagInfo(0xa402, "ExposureMode", "Exposure mode", exifIfd, exifIfdSection),
+ TagInfo(0xa403, "WhiteBalance", "White balance", exifIfd, exifIfdSection),
+ TagInfo(0xa404, "DigitalZoomRatio", "Digital zoom ratio", exifIfd, exifIfdSection),
+ TagInfo(0xa405, "FocalLengthIn35mmFilm", "Focal length in 35 mm film", exifIfd, exifIfdSection),
+ TagInfo(0xa406, "SceneCaptureType", "Scene capture type", exifIfd, exifIfdSection),
+ TagInfo(0xa407, "GainControl", "Gain control", exifIfd, exifIfdSection),
+ TagInfo(0xa408, "Contrast", "Contrast", exifIfd, exifIfdSection),
+ TagInfo(0xa409, "Saturation", "Saturation", exifIfd, exifIfdSection),
+ TagInfo(0xa40a, "Sharpness", "Sharpness", exifIfd, exifIfdSection),
+ TagInfo(0xa40b, "DeviceSettingDescription", "Device settings description", exifIfd, exifIfdSection),
+ TagInfo(0xa40c, "SubjectDistanceRange", "Subject distance range", exifIfd, exifIfdSection),
+ TagInfo(0xa420, "ImageUniqueID", "Unique image ID", exifIfd, exifIfdSection),
+
+ // End of list marker
+ TagInfo(0xffff, "(Unknown)", "Unknown tag", IfdIdNotSet, TagSectionNotSet)
+ };
+
+ int ExifTags::tagInfoIdx(uint16 tag, IfdId ifdId)
+ {
+ // Todo: implement a better algorithm
+ int idx;
+ for (idx = 0; tagInfo_[idx].tag_ != 0xffff; ++idx) {
+ if ( tagInfo_[idx].tag_ == tag
+ && tagInfo_[idx].ifdId_ == ifdId) break;
+ }
+ return idx;
+ }
+
+ const char* ExifTags::tagName(uint16 tag, IfdId ifdId)
+ {
+ return tagInfo_[tagInfoIdx(tag, ifdId)].name_;
+ }
+
+ const char* ExifTags::typeName(uint16 type)
+ {
+ return tagFormat_[type].name_;
+ }
+
+ long ExifTags::typeSize(uint16 type)
+ {
+ return tagFormat_[type].size_;
+ }
+
+ // *************************************************************************
+ // free functions
+
+} // namespace Exif
+
+// *****************************************************************************
+// local definitions
+namespace {
+
+}
diff --git a/src/tags.h b/src/tags.h
new file mode 100644
index 0000000..0d68750
--- /dev/null
+++ b/src/tags.h
@@ -0,0 +1,108 @@
+// ***************************************************************** -*- C++ -*-
+/*
+ * Copyright (c) 2004 Andreas Huggel. All rights reserved.
+ *
+ * Todo: Insert license blabla here
+ *
+ */
+/*!
+ @file tags.h
+ @brief %Exif tag and type information
+ @version $Name: $ $Revision: 1.1 $
+ @author Andreas Huggel (ahu)
+ @date 15-Jan-03, ahu: created
+ */
+#ifndef _TAGS_H_
+#define _TAGS_H_
+
+// *****************************************************************************
+// included header files
+
+// + standard includes
+
+// *****************************************************************************
+// namespace extensions
+namespace Exif {
+
+// *****************************************************************************
+// type definitions
+
+ //! 2 byte unsigned integer type.
+ typedef unsigned short uint16;
+ //! 4 byte unsigned integer type.
+ typedef unsigned long uint32;
+ //! 2 byte signed integer type.
+ typedef short int16;
+ //! 4 byte signed integer type.
+ typedef long int32;
+
+ //! Type to specify the IFD to which a metadata belongs
+ enum IfdId { IfdIdNotSet,
+ ifd0, ifd1, exifIfd, gpsIfd,
+ makerNoteIfd, exifIopIfd, ifd1IopIfd };
+
+ //! Section identifiers to logically group tags
+ enum TagSection { TagSectionNotSet,
+ ifd0Tiff, ifd1Section, exifIfdSection, gpsIfdSection,
+ exifIopIfdSection };
+
+// *****************************************************************************
+// class definitions
+
+ //! Description of the format of a metadatum
+ struct TagFormat {
+ //! Constructor
+ TagFormat(uint16 type, const char* name, long size);
+ uint16 type_; //!< Format type id
+ const char* name_; //!< Name of the format
+ long size_; //!< Bytes per data entry
+ }; // struct TagFormat
+
+ //! Tag information
+ struct TagInfo {
+ //! Constructor
+ TagInfo(
+ uint16 tag,
+ const char* name,
+ const char* desc,
+ IfdId ifdId,
+ TagSection section
+ );
+ uint16 tag_; //!< Tag
+ const char* name_; //!< One word tag label
+ const char* desc_; //!< Short tag description
+ IfdId ifdId_; //!< Link to the IFD
+ TagSection section_; //!< Section id
+ }; // struct TagInfo
+
+ //! Container for Exif tag information. Implemented as a static class.
+ class ExifTags {
+ //! Prevent construction: not implemented.
+ ExifTags() {}
+ //! Prevent copy-construction: not implemented.
+ ExifTags(const ExifTags& rhs);
+ //! Prevent assignment: not implemented.
+ ExifTags& operator=(const ExifTags& rhs);
+
+ public:
+ //! Returns the name of the tag
+ static const char* tagName(uint16 tag, IfdId ifdId);
+ //! Returns the name of the type
+ static const char* typeName(uint16 type);
+ //! Returns the size in bytes of one element of this type
+ static long typeSize(uint16 type);
+
+ private:
+ static int tagInfoIdx(uint16 tag, IfdId ifdId);
+
+ static const TagFormat tagFormat_[];
+ static const TagInfo tagInfo_[];
+
+ };
+
+// *****************************************************************************
+// free functions
+
+} // namespace Exif
+
+#endif // #ifndef _TAGS_H_
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list