Exiv2
exif.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
10 #ifndef EXIF_HPP_
11 #define EXIF_HPP_
12 
13 // *****************************************************************************
14 #include "exiv2lib_export.h"
15 
16 // included header files
17 #include "metadatum.hpp"
18 #include "tags.hpp"
19 
20 // + standard includes
21 #include <list>
22 
23 // *****************************************************************************
24 // namespace extensions
29 namespace Exiv2 {
30 // *****************************************************************************
31 // class declarations
32 class ExifData;
33 
34 // *****************************************************************************
35 // class definitions
36 
41 class EXIV2API Exifdatum : public Metadatum {
42  template <typename T>
43  friend Exifdatum& setValue(Exifdatum&, const T&);
44 
45  public:
47 
48 
59  explicit Exifdatum(const ExifKey& key, const Value* pValue = nullptr);
61  Exifdatum(const Exifdatum& rhs);
63  ~Exifdatum() override = default;
65 
67 
68  Exifdatum& operator=(const Exifdatum& rhs);
74  Exifdatum& operator=(const uint16_t& value);
79  Exifdatum& operator=(const uint32_t& value);
84  Exifdatum& operator=(const URational& value);
89  Exifdatum& operator=(const int16_t& value);
94  Exifdatum& operator=(const int32_t& value);
99  Exifdatum& operator=(const Rational& value);
104  Exifdatum& operator=(const std::string& value);
109  Exifdatum& operator=(const Value& value);
110  void setValue(const Value* pValue) override;
118  int setValue(const std::string& value) override;
132  int setDataArea(const byte* buf, size_t len) const;
134 
136 
137  [[nodiscard]] std::string key() const override;
139  [[nodiscard]] const char* familyName() const override;
140  [[nodiscard]] std::string groupName() const override;
141  [[nodiscard]] std::string tagName() const override;
142  [[nodiscard]] std::string tagLabel() const override;
143  [[nodiscard]] std::string tagDesc() const override;
144  [[nodiscard]] uint16_t tag() const override;
146  [[nodiscard]] IfdId ifdId() const;
148  [[nodiscard]] const char* ifdName() const;
150  [[nodiscard]] int idx() const;
162  size_t copy(byte* buf, ByteOrder byteOrder) const override;
163  std::ostream& write(std::ostream& os, const ExifData* pMetadata = nullptr) const override;
165  [[nodiscard]] TypeId typeId() const override;
167  [[nodiscard]] const char* typeName() const override;
169  [[nodiscard]] size_t typeSize() const override;
171  [[nodiscard]] size_t count() const override;
173  [[nodiscard]] size_t size() const override;
175  [[nodiscard]] std::string toString() const override;
176  [[nodiscard]] std::string toString(size_t n) const override;
177  [[nodiscard]] int64_t toInt64(size_t n = 0) const override;
178  [[nodiscard]] float toFloat(size_t n = 0) const override;
179  [[nodiscard]] Rational toRational(size_t n = 0) const override;
180  [[nodiscard]] Value::UniquePtr getValue() const override;
181  [[nodiscard]] const Value& value() const override;
183  [[nodiscard]] size_t sizeDataArea() const;
196  [[nodiscard]] DataBuf dataArea() const;
198 
199  private:
200  // DATA
201  ExifKey::UniquePtr key_;
202  Value::UniquePtr value_;
203 
204 }; // class Exifdatum
205 
217 class EXIV2API ExifThumbC {
218  public:
220 
221  explicit ExifThumbC(const ExifData& exifData);
224 
226 
227 
231  [[nodiscard]] DataBuf copy() const;
232 #ifdef EXV_ENABLE_FILESYSTEM
233 
243  [[nodiscard]] size_t writeFile(const std::string& path) const;
244 #endif
245 
249  [[nodiscard]] const char* mimeType() const;
254  [[nodiscard]] const char* extension() const;
256 
257  private:
258  // DATA
259  const ExifData& exifData_;
260 
261 }; // class ExifThumb
262 
274 class EXIV2API ExifThumb : public ExifThumbC {
275  public:
277 
278  explicit ExifThumb(ExifData& exifData);
281 
283 
284 #ifdef EXV_ENABLE_FILESYSTEM
285 
302  void setJpegThumbnail(const std::string& path, URational xres, URational yres, uint16_t unit);
303 #endif
304 
321  void setJpegThumbnail(const byte* buf, size_t size, URational xres, URational yres, uint16_t unit);
322 #ifdef EXV_ENABLE_FILESYSTEM
323 
336  void setJpegThumbnail(const std::string& path);
337 #endif
338 
350  void setJpegThumbnail(const byte* buf, size_t size);
355  void erase();
357 
358  private:
359  // DATA
360  ExifData& exifData_;
361 
362 }; // class ExifThumb
363 
365 using ExifMetadata = std::list<Exifdatum>;
366 
379 class EXIV2API ExifData {
380  public:
382  using iterator = ExifMetadata::iterator;
384  using const_iterator = ExifMetadata::const_iterator;
385 
387 
388 
396  Exifdatum& operator[](const std::string& key);
403  void add(const ExifKey& key, const Value* pValue);
411  void add(const Exifdatum& exifdatum);
418  iterator erase(iterator pos);
424  iterator erase(iterator beg, iterator end);
429  void clear();
431  void sortByKey();
433  void sortByTag();
436  return exifMetadata_.begin();
437  }
440  return exifMetadata_.end();
441  }
446  iterator findKey(const ExifKey& key);
448 
450 
451  [[nodiscard]] const_iterator begin() const {
453  return exifMetadata_.begin();
454  }
456  [[nodiscard]] const_iterator end() const {
457  return exifMetadata_.end();
458  }
463  [[nodiscard]] const_iterator findKey(const ExifKey& key) const;
465  [[nodiscard]] bool empty() const {
466  return exifMetadata_.empty();
467  }
469  [[nodiscard]] size_t count() const {
470  return exifMetadata_.size();
471  }
473 
474  private:
475  // DATA
476  ExifMetadata exifMetadata_;
477 }; // class ExifData
478 
485 class EXIV2API ExifParser {
486  public:
500  static ByteOrder decode(ExifData& exifData, const byte* pData, size_t size);
539  static WriteMethod encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData);
560  static void encode(Blob& blob, ByteOrder byteOrder, ExifData& exifData) {
561  encode(blob, nullptr, 0, byteOrder, exifData);
562  }
563 
564 }; // class ExifParser
565 
566 } // namespace Exiv2
567 
568 #endif // #ifndef EXIF_HPP_
const char * ifdName(IfdId ifdId)
Return the name of the IFD.
Definition: tags_int.cpp:2471
bool empty() const
Return true if there is no Exif metadata.
Definition: exif.hpp:465
std::list< Exifdatum > ExifMetadata
Container type to hold all metadata.
Definition: exif.hpp:365
Concrete keys for Exif metadata and access to Exif tag reference data.
Definition: tags.hpp:271
A container for Exif data. This is a top-level class of the Exiv2 library. The container holds Exifda...
Definition: exif.hpp:379
ByteOrder
Type to express the byte order (little or big endian)
Definition: types.hpp:34
T getValue(const byte *buf, ByteOrder byteOrder)
Read a value of type T from the data buffer.
Definition: value.hpp:1332
Access and modify an Exif thumbnail image. This class implements manipulators to set and erase the th...
Definition: exif.hpp:274
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:70
uint8_t byte
1 byte unsigned integer type.
Definition: types.hpp:26
ExifMetadata::const_iterator const_iterator
ExifMetadata const iterator type.
Definition: exif.hpp:384
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
iterator begin()
Begin of the metadata.
Definition: exif.hpp:435
IfdId
Type to specify the IFD to which a metadata belongs.
Definition: tags.hpp:34
WriteMethod
Type to indicate write method used by TIFF parsers.
Definition: types.hpp:41
std::pair< int32_t, int32_t > Rational
8 byte signed rational type.
Definition: types.hpp:31
Stateless parser class for Exif data. Images use this class to decode and encode binary Exif data...
Definition: exif.hpp:485
iterator end()
End of the metadata.
Definition: exif.hpp:439
List of TIFF compression to MIME type mappings.
Definition: tiffimage.cpp:47
size_t count() const
Get the number of metadata entries.
Definition: exif.hpp:469
Exiv2::Exifdatum & setValue(Exiv2::Exifdatum &exifDatum, const T &value)
Set the value of exifDatum to value. If the object already has a value, it is replaced. Otherwise a new ValueType value is created and set to value.
Definition: exif.cpp:147
const char * groupName(IfdId ifdId)
Return the group name for a group id.
Definition: tags_int.cpp:2477
std::unique_ptr< ExifKey > UniquePtr
Shortcut for an ExifKey auto pointer.
Definition: tags.hpp:274
Common interface for all types of values used with metadata.
Definition: value.hpp:33
static void encode(Blob &blob, ByteOrder byteOrder, ExifData &exifData)
Encode metadata from the provided metadata to Exif format.
Definition: exif.hpp:560
ExifMetadata::iterator iterator
ExifMetadata iterator type.
Definition: exif.hpp:382
Class CrwImage to access Canon CRW images. References: The Canon RAW (CRW) File Format by Phil Harv...
Definition: asfvideo.hpp:15
std::pair< uint32_t, uint32_t > URational
8 byte unsigned rational type.
Definition: types.hpp:29
EXIV2API size_t writeFile(const DataBuf &buf, const std::string &path)
Write DataBuf buf to file path.
An Exif metadatum, consisting of an ExifKey and a Value and methods to manipulate these...
Definition: exif.hpp:41
Abstract base class defining the interface to access information related to one metadata tag...
Definition: metadatum.hpp:103
std::vector< byte > Blob
Container for binary data.
Definition: types.hpp:102
const_iterator end() const
End of the metadata.
Definition: exif.hpp:456
Access to a Exif thumbnail image. This class provides higher level accessors to the thumbnail image t...
Definition: exif.hpp:217
std::unique_ptr< Value > UniquePtr
Shortcut for a Value auto pointer.
Definition: value.hpp:36