55 Exiv2::ExifKey key(
"Exif.Image.Software");
56 Exiv2::ExifData::iterator it = exifData.findKey(key);
57 if (it == exifData.end())
65 if (!d->xmpMetadata().empty())
68 Exiv2::XmpData xmpData(d->xmpMetadata());
69 Exiv2::XmpKey key(
"Xmp.xmp.CreatorTool");
70 Exiv2::XmpData::iterator it = xmpData.findKey(key);
71 if (it == xmpData.end())
77 #endif // _XMP_SUPPORT_
85 catch( Exiv2::Error& e )
91 kError() <<
"Default exception from Exiv2";
101 long width=-1, height=-1;
106 Exiv2::ExifKey key(
"Exif.Photo.PixelXDimension");
107 Exiv2::ExifData::iterator it = exifData.findKey(key);
108 if (it != exifData.end() && it->count())
109 width = it->toLong();
111 Exiv2::ExifKey key2(
"Exif.Photo.PixelYDimension");
112 Exiv2::ExifData::iterator it2 = exifData.findKey(key2);
113 if (it2 != exifData.end() && it2->count())
114 height = it2->toLong();
116 if (width != -1 && height != -1)
117 return QSize(width, height);
124 Exiv2::ExifKey key3(
"Exif.Image.ImageWidth");
125 Exiv2::ExifData::iterator it3 = exifData.findKey(key3);
126 if (it3 != exifData.end() && it3->count())
127 width = it3->toLong();
129 Exiv2::ExifKey key4(
"Exif.Image.ImageLength");
130 Exiv2::ExifData::iterator it4 = exifData.findKey(key4);
131 if (it4 != exifData.end() && it4->count())
132 height = it4->toLong();
134 if (width != -1 && height != -1)
135 return QSize(width, height);
148 width = str.
toInt(&wOk);
152 height = str.
toInt(&hOk);
155 return QSize(width, height);
166 width = str.
toInt(&wOk);
170 height = str.
toInt(&hOk);
173 return QSize(width, height);
175 #endif // _XMP_SUPPORT_
178 catch( Exiv2::Error& e )
184 kError() <<
"Default exception from Exiv2";
200 d->
exifMetadata()[
"Exif.Image.ImageWidth"] =
static_cast<uint32_t
>(size.
width());
202 d->
exifMetadata()[
"Exif.Photo.PixelXDimension"] =
static_cast<uint32_t
>(size.
width());
203 d->
exifMetadata()[
"Exif.Photo.PixelYDimension"] =
static_cast<uint32_t
>(size.
height());
214 #endif // _XMP_SUPPORT_
218 catch( Exiv2::Error& e )
224 kError() <<
"Default exception from Exiv2";
235 Exiv2::ExifData::iterator it;
247 orientation = str.
toLong(&ok);
250 kDebug() <<
"Orientation => Xmp.tiff.Orientation => " << (int)orientation;
255 #endif // _XMP_SUPPORT_
262 Exiv2::ExifKey minoltaKey1(
"Exif.MinoltaCs7D.Rotation");
263 it = exifData.findKey(minoltaKey1);
265 if (it != exifData.end() && it->count())
267 orientation = it->toLong();
268 kDebug() <<
"Orientation => Exif.MinoltaCs7D.Rotation => " << (int)orientation;
281 Exiv2::ExifKey minoltaKey2(
"Exif.MinoltaCs5D.Rotation");
282 it = exifData.findKey(minoltaKey2);
284 if (it != exifData.end() && it->count())
286 orientation = it->toLong();
287 kDebug() <<
"Orientation => Exif.MinoltaCs5D.Rotation => " << (int)orientation;
302 Exiv2::ExifKey keyStd(
"Exif.Image.Orientation");
303 it = exifData.findKey(keyStd);
305 if (it != exifData.end() && it->count())
307 orientation = it->toLong();
308 kDebug() <<
"Orientation => Exif.Image.Orientation => " << (int)orientation;
313 catch( Exiv2::Error& e )
319 kError() <<
"Default exception from Exiv2";
334 kDebug() <<
"Image orientation value is not correct!";
340 d->
exifMetadata()[
"Exif.Image.Orientation"] =
static_cast<uint16_t
>(orientation);
341 kDebug() <<
"Exif.Image.Orientation tag set to: " << (int)orientation;
349 #endif // _XMP_SUPPORT_
356 Exiv2::ExifData::iterator it;
358 Exiv2::ExifKey minoltaKey1(
"Exif.MinoltaCs7D.Rotation");
363 kDebug() <<
"Removing Exif.MinoltaCs7D.Rotation tag";
366 Exiv2::ExifKey minoltaKey2(
"Exif.MinoltaCs5D.Rotation");
371 kDebug() <<
"Removing Exif.MinoltaCs5D.Rotation tag";
376 Exiv2::ExifKey thumbKey(
"Exif.Thumbnail.Orientation");
381 operation *= orientation;
382 (*it) =
static_cast<uint16_t
>(operation.exifOrientation());
387 catch( Exiv2::Error& e )
393 kError() <<
"Default exception from Exiv2";
403 long exifColorSpace = -1;
409 exifColorSpace = var.
toInt();
410 #endif // _XMP_SUPPORT_
413 if (exifColorSpace == 1)
417 else if (exifColorSpace == 2)
423 if (exifColorSpace == 65535)
428 if (!interopIndex.
isNull())
430 if (interopIndex ==
"R03")
432 else if (interopIndex ==
"R98")
442 long nikonColorSpace;
445 if (nikonColorSpace == 1)
447 else if (nikonColorSpace == 2)
469 if (exifColorSpace == 65535)
485 d->
exifMetadata()[
"Exif.Photo.ColorSpace"] =
static_cast<uint16_t
>(workspace);
493 #endif // _XMP_SUPPORT_
497 catch( Exiv2::Error& e )
503 kError() <<
"Default exception from Exiv2";
519 Exiv2::ExifKey key(
"Exif.Photo.DateTimeOriginal");
520 Exiv2::ExifData::iterator it = exifData.findKey(key);
522 if (it != exifData.end())
528 kDebug() <<
"DateTime => Exif.Photo.DateTimeOriginal => " << dateTime;
534 Exiv2::ExifKey key(
"Exif.Photo.DateTimeDigitized");
535 Exiv2::ExifData::iterator it = exifData.findKey(key);
537 if (it != exifData.end())
543 kDebug() <<
"DateTime => Exif.Photo.DateTimeDigitized => " << dateTime;
549 Exiv2::ExifKey key(
"Exif.Image.DateTime");
550 Exiv2::ExifData::iterator it = exifData.findKey(key);
552 if (it != exifData.end())
558 kDebug() <<
"DateTime => Exif.Image.DateTime => " << dateTime;
569 if (!d->xmpMetadata().empty())
571 Exiv2::XmpData xmpData(d->xmpMetadata());
573 Exiv2::XmpKey key(
"Xmp.exif.DateTimeOriginal");
574 Exiv2::XmpData::iterator it = xmpData.findKey(key);
576 if (it != xmpData.end())
582 kDebug() <<
"DateTime => Xmp.exif.DateTimeOriginal => " << dateTime;
588 Exiv2::XmpKey key(
"Xmp.exif.DateTimeDigitized");
589 Exiv2::XmpData::iterator it = xmpData.findKey(key);
591 if (it != xmpData.end())
597 kDebug() <<
"DateTime => Xmp.exif.DateTimeDigitized => " << dateTime;
603 Exiv2::XmpKey key(
"Xmp.photoshop.DateCreated");
604 Exiv2::XmpData::iterator it = xmpData.findKey(key);
606 if (it != xmpData.end())
612 kDebug() <<
"DateTime => Xmp.photoshop.DateCreated => " << dateTime;
618 Exiv2::XmpKey key(
"Xmp.xmp.CreateDate");
619 Exiv2::XmpData::iterator it = xmpData.findKey(key);
621 if (it != xmpData.end())
627 kDebug() <<
"DateTime => Xmp.xmp.CreateDate => " << dateTime;
633 Exiv2::XmpKey key(
"Xmp.tiff.DateTime");
634 Exiv2::XmpData::iterator it = xmpData.findKey(key);
636 if (it != xmpData.end())
642 kDebug() <<
"DateTime => Xmp.tiff.DateTime => " << dateTime;
648 Exiv2::XmpKey key(
"Xmp.xmp.ModifyDate");
649 Exiv2::XmpData::iterator it = xmpData.findKey(key);
651 if (it != xmpData.end())
657 kDebug() <<
"DateTime => Xmp.xmp.ModifyDate => " << dateTime;
663 Exiv2::XmpKey key(
"Xmp.xmp.MetadataDate");
664 Exiv2::XmpData::iterator it = xmpData.findKey(key);
666 if (it != xmpData.end())
672 kDebug() <<
"DateTime => Xmp.xmp.MetadataDate => " << dateTime;
679 #endif // _XMP_SUPPORT_
689 Exiv2::IptcKey keyDateCreated(
"Iptc.Application2.DateCreated");
690 Exiv2::IptcData::iterator it = iptcData.findKey(keyDateCreated);
692 if (it != iptcData.end())
694 QString IptcDateCreated(it->toString().c_str());
695 Exiv2::IptcKey keyTimeCreated(
"Iptc.Application2.TimeCreated");
696 Exiv2::IptcData::iterator it2 = iptcData.findKey(keyTimeCreated);
698 if (it2 != iptcData.end())
700 QString IptcTimeCreated(it2->toString().c_str());
707 kDebug() <<
"DateTime => Iptc.Application2.DateCreated => " << dateTime;
715 Exiv2::IptcKey keyDigitizationDate(
"Iptc.Application2.DigitizationDate");
716 Exiv2::IptcData::iterator it3 = iptcData.findKey(keyDigitizationDate);
718 if (it3 != iptcData.end())
720 QString IptcDateDigitization(it3->toString().c_str());
721 Exiv2::IptcKey keyDigitizationTime(
"Iptc.Application2.DigitizationTime");
722 Exiv2::IptcData::iterator it4 = iptcData.findKey(keyDigitizationTime);
724 if (it4 != iptcData.end())
726 QString IptcTimeDigitization(it4->toString().c_str());
733 kDebug() <<
"DateTime => Iptc.Application2.DigitizationDate => " << dateTime;
740 catch( Exiv2::Error& e )
746 kError() <<
"Default exception from Exiv2";
770 d->
exifMetadata()[
"Exif.Image.DateTime"] = exifdatetime;
771 d->
exifMetadata()[
"Exif.Photo.DateTimeOriginal"] = exifdatetime;
772 if(setDateTimeDigitized)
773 d->
exifMetadata()[
"Exif.Photo.DateTimeDigitized"] = exifdatetime;
781 Exiv2::Value::AutoPtr xmpTxtVal = Exiv2::Value::create(Exiv2::xmpText);
782 xmpTxtVal->read(xmpdatetime);
783 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.exif.DateTimeOriginal"), xmpTxtVal.get());
784 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.photoshop.DateCreated"), xmpTxtVal.get());
785 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.tiff.DateTime"), xmpTxtVal.get());
786 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.CreateDate"), xmpTxtVal.get());
787 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.MetadataDate"), xmpTxtVal.get());
788 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.ModifyDate"), xmpTxtVal.get());
789 if(setDateTimeDigitized)
790 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.exif.DateTimeDigitized"), xmpTxtVal.get());
796 #endif // _XMP_SUPPORT_
802 d->
iptcMetadata()[
"Iptc.Application2.DateCreated"] = iptcdate;
803 d->
iptcMetadata()[
"Iptc.Application2.TimeCreated"] = iptctime;
804 if(setDateTimeDigitized)
806 d->
iptcMetadata()[
"Iptc.Application2.DigitizationDate"] = iptcdate;
807 d->
iptcMetadata()[
"Iptc.Application2.DigitizationTime"] = iptctime;
812 catch( Exiv2::Error& e )
818 kError() <<
"Default exception from Exiv2";
835 Exiv2::ExifKey key(
"Exif.Photo.DateTimeDigitized");
836 Exiv2::ExifData::iterator it = exifData.findKey(key);
838 if (it != exifData.end())
857 Exiv2::IptcKey keyDigitizationDate(
"Iptc.Application2.DigitizationDate");
858 Exiv2::IptcData::iterator it = iptcData.findKey(keyDigitizationDate);
860 if (it != iptcData.end())
862 QString IptcDateDigitization(it->toString().c_str());
864 Exiv2::IptcKey keyDigitizationTime(
"Iptc.Application2.DigitizationTime");
865 Exiv2::IptcData::iterator it2 = iptcData.findKey(keyDigitizationTime);
867 if (it2 != iptcData.end())
869 QString IptcTimeDigitization(it2->toString().c_str());
884 catch( Exiv2::Error& e )
890 kError() <<
"Default exception from Exiv2";
893 if (fallbackToCreationTime)
909 catch( Exiv2::Error& e )
915 kError() <<
"Default exception from Exiv2";
938 buffer.
open(QIODevice::WriteOnly);
941 preview.
save(&buffer,
"JPEG");
942 kDebug() <<
"JPEG image preview size: (" << preview.
width() <<
" x "
943 << preview.
height() <<
") pixels - " << data.
size() <<
" bytes";
945 Exiv2::DataValue val;
946 val.read((Exiv2::byte *)data.
data(), data.
size());
950 d->
iptcMetadata()[
"Iptc.Application2.PreviewFormat"] = 11;
951 d->
iptcMetadata()[
"Iptc.Application2.PreviewVersion"] = 1;
955 catch( Exiv2::Error& e )
961 kError() <<
"Default exception from Exiv2";
QString toString(Qt::DateFormat format) const
bool loadFromData(const uchar *data, int len, const char *format)
const Exiv2::ExifData & exifMetadata() const
QString & append(QChar ch)
ImageColorWorkSpace
The image color workspace values given by Exif metadata.
const Exiv2::IptcData & iptcMetadata() const
QString toString(Qt::DateFormat format) const
QString toString(Qt::DateFormat format) const
bool save(const QString &fileName, const char *format, int quality) const
bool setXmpTagString(const char *xmpTagName, const QString &value, bool setProgramName=true) const
Set a Xmp tag content using a string.
QTime fromString(const QString &string, Qt::DateFormat format)
bool setImageProgramId(const QString &program, const QString &version) const
Set Program name and program version in Exif and Iptc Metadata.
ImageOrientation
The image orientation values given by Exif metadata.
bool getExifTagLong(const char *exifTagName, long &val) const
Get an Exif tag content like a long value.
QByteArray getIptcTagData(const char *iptcTagName) const
Get an Iptc tag content as a bytes array.
QDate fromString(const QString &string, Qt::DateFormat format)
QString number(int n, int base)
int toInt(bool *ok) const
int toInt(bool *ok, int base) const
const char * constData() const
virtual bool open(QFlags< QIODevice::OpenModeFlag > flags)
bool getImagePreview(QImage &preview) const
Return a QImage copy of Iptc preview image.
QDateTime getDigitizationDateTime(bool fallbackToCreationTime=false) const
Return the digitization time stamp of the image.
QSize getImageDimensions() const
Return the size of image in pixels using Exif tags.
QString getExifTagString(const char *exifTagName, bool escapeCR=true) const
Get an Exif tags content like a string.
bool contains(QChar ch, Qt::CaseSensitivity cs) const
bool removeIptcTag(const char *iptcTagName, bool setProgramName=true) const
Remove the all instance of Iptc tags 'iptcTagName' from Iptc metadata.
QDateTime fromString(const QString &string, Qt::DateFormat format)
virtual bool setProgramId(bool on=true) const
Re-implement this method to set automatically the Program Name and Program Version information in Exi...
bool setImageOrientation(ImageOrientation orientation, bool setProgramName=true) const
Set the Exif orientation tag of image.
bool setImageDimensions(const QSize &size, bool setProgramName=true) const
Set the size of image in pixels in Exif tags.
KExiv2::ImageOrientation getImageOrientation() const
Return the image orientation set in Exif metadata.
long toLong(bool *ok, int base) const
bool setImageColorWorkSpace(ImageColorWorkSpace workspace, bool setProgramName=true) const
Set the Exif color-space tag of image.
QString getXmpTagString(const char *xmpTagName, bool escapeCR=true) const
Get a Xmp tag content like a string.
===========================================================This file is a part of digiKam project htt...
QVariant getXmpTagVariant(const char *xmpTagName, bool rationalAsListOfInts=true, bool stringEscapeCR=true) const
Get an Xmp tag content as a QVariant.
static void printExiv2ExceptionError(const QString &msg, Exiv2::Error &e)
Generic method to print the Exiv2 C++ Exception error message from 'e'.
virtual bool setImagePreview(const QImage &preview, bool setProgramName=true) const
Set the Iptc preview image.
bool setImageDateTime(const QDateTime &dateTime, bool setDateTimeDigitized=false, bool setProgramName=true) const
Set the Exif and Iptc time stamp.
===========================================================This file is a part of digiKam project htt...
KExiv2::ImageColorWorkSpace getImageColorWorkSpace() const
Return the image color-space set in Exif metadata.
QDateTime getImageDateTime() const
Return the time stamp of image.
===========================================================This file is a part of digiKam project htt...
QByteArray toAscii() const