42 QString software(program);
44 software.append(version);
48 d->
exifMetadata()[
"Exif.Image.ProcessingSoftware"] = std::string(software.toAscii().constData());
55 Exiv2::ExifKey key(
"Exif.Image.Software");
56 Exiv2::ExifData::iterator it = exifData.findKey(key);
57 if (it == exifData.end())
58 d->
exifMetadata()[
"Exif.Image.Software"] = std::string(software.toAscii().constData());
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_
81 d->
iptcMetadata()[
"Iptc.Application2.Program"] = std::string(program.toAscii().constData());
82 d->
iptcMetadata()[
"Iptc.Application2.ProgramVersion"] = std::string(version.toAscii().constData());
85 catch( Exiv2::Error& e )
97 long width=-1, height=-1;
102 Exiv2::ExifKey key(
"Exif.Photo.PixelXDimension");
103 Exiv2::ExifData::iterator it = exifData.findKey(key);
104 if (it != exifData.end() && it->count())
105 width = it->toLong();
107 Exiv2::ExifKey key2(
"Exif.Photo.PixelYDimension");
108 Exiv2::ExifData::iterator it2 = exifData.findKey(key2);
109 if (it2 != exifData.end() && it2->count())
110 height = it2->toLong();
112 if (width != -1 && height != -1)
113 return QSize(width, height);
120 Exiv2::ExifKey key3(
"Exif.Image.ImageWidth");
121 Exiv2::ExifData::iterator it3 = exifData.findKey(key3);
122 if (it3 != exifData.end() && it3->count())
123 width = it3->toLong();
125 Exiv2::ExifKey key4(
"Exif.Image.ImageLength");
126 Exiv2::ExifData::iterator it4 = exifData.findKey(key4);
127 if (it4 != exifData.end() && it4->count())
128 height = it4->toLong();
130 if (width != -1 && height != -1)
131 return QSize(width, height);
144 width = str.toInt(&wOk);
148 height = str.toInt(&hOk);
151 return QSize(width, height);
162 width = str.toInt(&wOk);
166 height = str.toInt(&hOk);
169 return QSize(width, height);
171 #endif // _XMP_SUPPORT_
174 catch( Exiv2::Error& e )
192 d->
exifMetadata()[
"Exif.Image.ImageWidth"] =
static_cast<uint32_t
>(size.width());
193 d->
exifMetadata()[
"Exif.Image.ImageLength"] =
static_cast<uint32_t
>(size.height());
194 d->
exifMetadata()[
"Exif.Photo.PixelXDimension"] =
static_cast<uint32_t
>(size.width());
195 d->
exifMetadata()[
"Exif.Photo.PixelYDimension"] =
static_cast<uint32_t
>(size.height());
201 setXmpTagString(
"Xmp.tiff.ImageWidth", QString::number(size.width()),
false);
202 setXmpTagString(
"Xmp.tiff.ImageLength", QString::number(size.height()),
false);
203 setXmpTagString(
"Xmp.exif.PixelXDimension", QString::number(size.width()),
false);
204 setXmpTagString(
"Xmp.exif.PixelYDimension", QString::number(size.height()),
false);
206 #endif // _XMP_SUPPORT_
210 catch( Exiv2::Error& e )
223 Exiv2::ExifData::iterator it;
235 orientation = str.toLong(&ok);
238 kDebug() <<
"Orientation => Xmp.tiff.Orientation => " << (int)orientation;
243 #endif // _XMP_SUPPORT_
250 Exiv2::ExifKey minoltaKey1(
"Exif.MinoltaCs7D.Rotation");
251 it = exifData.findKey(minoltaKey1);
253 if (it != exifData.end() && it->count())
255 orientation = it->toLong();
256 kDebug() <<
"Orientation => Exif.MinoltaCs7D.Rotation => " << (int)orientation;
269 Exiv2::ExifKey minoltaKey2(
"Exif.MinoltaCs5D.Rotation");
270 it = exifData.findKey(minoltaKey2);
272 if (it != exifData.end() && it->count())
274 orientation = it->toLong();
275 kDebug() <<
"Orientation => Exif.MinoltaCs5D.Rotation => " << (int)orientation;
290 Exiv2::ExifKey keyStd(
"Exif.Image.Orientation");
291 it = exifData.findKey(keyStd);
293 if (it != exifData.end() && it->count())
295 orientation = it->toLong();
296 kDebug() <<
"Orientation => Exif.Image.Orientation => " << (int)orientation;
301 catch( Exiv2::Error& e )
318 kDebug() <<
"Image orientation value is not correct!";
324 d->
exifMetadata()[
"Exif.Image.Orientation"] =
static_cast<uint16_t
>(orientation);
325 kDebug() <<
"Exif.Image.Orientation tag set to: " << (int)orientation;
331 setXmpTagString(
"Xmp.tiff.Orientation", QString::number((
int)orientation),
false);
333 #endif // _XMP_SUPPORT_
340 Exiv2::ExifData::iterator it;
342 Exiv2::ExifKey minoltaKey1(
"Exif.MinoltaCs7D.Rotation");
347 kDebug() <<
"Removing Exif.MinoltaCs7D.Rotation tag";
350 Exiv2::ExifKey minoltaKey2(
"Exif.MinoltaCs5D.Rotation");
355 kDebug() <<
"Removing Exif.MinoltaCs5D.Rotation tag";
360 Exiv2::ExifKey thumbKey(
"Exif.Thumbnail.Orientation");
365 operation *= orientation;
366 (*it) =
static_cast<uint16_t
>(operation.exifOrientation());
371 catch( Exiv2::Error& e )
383 long exifColorSpace = -1;
389 exifColorSpace = var.toInt();
390 #endif // _XMP_SUPPORT_
393 if (exifColorSpace == 1)
397 else if (exifColorSpace == 2)
403 if (exifColorSpace == 65535)
408 if (!interopIndex.isNull())
410 if (interopIndex ==
"R03")
412 else if (interopIndex ==
"R98")
422 long nikonColorSpace;
425 if (nikonColorSpace == 1)
427 else if (nikonColorSpace == 2)
449 if (exifColorSpace == 65535)
465 d->
exifMetadata()[
"Exif.Photo.ColorSpace"] =
static_cast<uint16_t
>(workspace);
471 setXmpTagString(
"Xmp.exif.ColorSpace", QString::number((
int)workspace),
false);
473 #endif // _XMP_SUPPORT_
477 catch( Exiv2::Error& e )
495 Exiv2::ExifKey key(
"Exif.Photo.DateTimeOriginal");
496 Exiv2::ExifData::iterator it = exifData.findKey(key);
497 if (it != exifData.end())
499 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
500 if (dateTime.isValid())
502 kDebug() <<
"DateTime => Exif.Photo.DateTimeOriginal => " << dateTime;
508 Exiv2::ExifKey key(
"Exif.Photo.DateTimeDigitized");
509 Exiv2::ExifData::iterator it = exifData.findKey(key);
510 if (it != exifData.end())
512 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
513 if (dateTime.isValid())
515 kDebug() <<
"DateTime => Exif.Photo.DateTimeDigitized => " << dateTime;
521 Exiv2::ExifKey key(
"Exif.Image.DateTime");
522 Exiv2::ExifData::iterator it = exifData.findKey(key);
523 if (it != exifData.end())
525 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
526 if (dateTime.isValid())
528 kDebug() <<
"DateTime => Exif.Image.DateTime => " << dateTime;
539 if (!d->xmpMetadata().empty())
541 Exiv2::XmpData xmpData(d->xmpMetadata());
543 Exiv2::XmpKey key(
"Xmp.exif.DateTimeOriginal");
544 Exiv2::XmpData::iterator it = xmpData.findKey(key);
545 if (it != xmpData.end())
547 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
548 if (dateTime.isValid())
550 kDebug() <<
"DateTime => Xmp.exif.DateTimeOriginal => " << dateTime;
556 Exiv2::XmpKey key(
"Xmp.exif.DateTimeDigitized");
557 Exiv2::XmpData::iterator it = xmpData.findKey(key);
558 if (it != xmpData.end())
560 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
561 if (dateTime.isValid())
563 kDebug() <<
"DateTime => Xmp.exif.DateTimeDigitized => " << dateTime;
569 Exiv2::XmpKey key(
"Xmp.photoshop.DateCreated");
570 Exiv2::XmpData::iterator it = xmpData.findKey(key);
571 if (it != xmpData.end())
573 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
574 if (dateTime.isValid())
576 kDebug() <<
"DateTime => Xmp.photoshop.DateCreated => " << dateTime;
582 Exiv2::XmpKey key(
"Xmp.xmp.CreateDate");
583 Exiv2::XmpData::iterator it = xmpData.findKey(key);
584 if (it != xmpData.end())
586 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
587 if (dateTime.isValid())
589 kDebug() <<
"DateTime => Xmp.xmp.CreateDate => " << dateTime;
595 Exiv2::XmpKey key(
"Xmp.tiff.DateTime");
596 Exiv2::XmpData::iterator it = xmpData.findKey(key);
597 if (it != xmpData.end())
599 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
600 if (dateTime.isValid())
602 kDebug() <<
"DateTime => Xmp.tiff.DateTime => " << dateTime;
608 Exiv2::XmpKey key(
"Xmp.xmp.ModifyDate");
609 Exiv2::XmpData::iterator it = xmpData.findKey(key);
610 if (it != xmpData.end())
612 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
613 if (dateTime.isValid())
615 kDebug() <<
"DateTime => Xmp.xmp.ModifyDate => " << dateTime;
621 Exiv2::XmpKey key(
"Xmp.xmp.MetadataDate");
622 Exiv2::XmpData::iterator it = xmpData.findKey(key);
623 if (it != xmpData.end())
625 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
626 if (dateTime.isValid())
628 kDebug() <<
"DateTime => Xmp.xmp.MetadataDate => " << dateTime;
635 #endif // _XMP_SUPPORT_
645 Exiv2::IptcKey keyDateCreated(
"Iptc.Application2.DateCreated");
646 Exiv2::IptcData::iterator it = iptcData.findKey(keyDateCreated);
647 if (it != iptcData.end())
649 QString IptcDateCreated(it->toString().c_str());
650 Exiv2::IptcKey keyTimeCreated(
"Iptc.Application2.TimeCreated");
651 Exiv2::IptcData::iterator it2 = iptcData.findKey(keyTimeCreated);
652 if (it2 != iptcData.end())
654 QString IptcTimeCreated(it2->toString().c_str());
655 QDate date = QDate::fromString(IptcDateCreated, Qt::ISODate);
656 QTime time = QTime::fromString(IptcTimeCreated, Qt::ISODate);
657 QDateTime dateTime = QDateTime(date, time);
658 if (dateTime.isValid())
660 kDebug() <<
"DateTime => Iptc.Application2.DateCreated => " << dateTime;
668 Exiv2::IptcKey keyDigitizationDate(
"Iptc.Application2.DigitizationDate");
669 Exiv2::IptcData::iterator it3 = iptcData.findKey(keyDigitizationDate);
670 if (it3 != iptcData.end())
672 QString IptcDateDigitization(it3->toString().c_str());
673 Exiv2::IptcKey keyDigitizationTime(
"Iptc.Application2.DigitizationTime");
674 Exiv2::IptcData::iterator it4 = iptcData.findKey(keyDigitizationTime);
675 if (it4 != iptcData.end())
677 QString IptcTimeDigitization(it4->toString().c_str());
678 QDate date = QDate::fromString(IptcDateDigitization, Qt::ISODate);
679 QTime time = QTime::fromString(IptcTimeDigitization, Qt::ISODate);
680 QDateTime dateTime = QDateTime(date, time);
681 if (dateTime.isValid())
683 kDebug() <<
"DateTime => Iptc.Application2.DigitizationDate => " << dateTime;
690 catch( Exiv2::Error& e )
700 if(!dateTime.isValid())
715 const std::string &exifdatetime(dateTime.toString(QString(
"yyyy:MM:dd hh:mm:ss")).toAscii().constData());
716 d->
exifMetadata()[
"Exif.Image.DateTime"] = exifdatetime;
717 d->
exifMetadata()[
"Exif.Photo.DateTimeOriginal"] = exifdatetime;
718 if(setDateTimeDigitized)
719 d->
exifMetadata()[
"Exif.Photo.DateTimeDigitized"] = exifdatetime;
725 const std::string &xmpdatetime(dateTime.toString(Qt::ISODate).toAscii().constData());
727 Exiv2::Value::AutoPtr xmpTxtVal = Exiv2::Value::create(Exiv2::xmpText);
728 xmpTxtVal->read(xmpdatetime);
729 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.exif.DateTimeOriginal"), xmpTxtVal.get());
730 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.photoshop.DateCreated"), xmpTxtVal.get());
731 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.tiff.DateTime"), xmpTxtVal.get());
732 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.CreateDate"), xmpTxtVal.get());
733 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.MetadataDate"), xmpTxtVal.get());
734 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.xmp.ModifyDate"), xmpTxtVal.get());
735 if(setDateTimeDigitized)
736 d->xmpMetadata().add(Exiv2::XmpKey(
"Xmp.exif.DateTimeDigitized"), xmpTxtVal.get());
742 #endif // _XMP_SUPPORT_
746 const std::string &iptcdate(dateTime.date().toString(Qt::ISODate).toAscii().constData());
747 const std::string &iptctime(dateTime.time().toString(Qt::ISODate).toAscii().constData());
748 d->
iptcMetadata()[
"Iptc.Application2.DateCreated"] = iptcdate;
749 d->
iptcMetadata()[
"Iptc.Application2.TimeCreated"] = iptctime;
750 if(setDateTimeDigitized)
752 d->
iptcMetadata()[
"Iptc.Application2.DigitizationDate"] = iptcdate;
753 d->
iptcMetadata()[
"Iptc.Application2.DigitizationTime"] = iptctime;
758 catch( Exiv2::Error& e )
777 Exiv2::ExifKey key(
"Exif.Photo.DateTimeDigitized");
778 Exiv2::ExifData::iterator it = exifData.findKey(key);
780 if (it != exifData.end())
782 QDateTime dateTime = QDateTime::fromString(it->toString().c_str(), Qt::ISODate);
784 if (dateTime.isValid())
786 kDebug() <<
"DateTime (Exif digitalized): " << dateTime.toString().toAscii().constData();
799 Exiv2::IptcKey keyDigitizationDate(
"Iptc.Application2.DigitizationDate");
800 Exiv2::IptcData::iterator it = iptcData.findKey(keyDigitizationDate);
802 if (it != iptcData.end())
804 QString IptcDateDigitization(it->toString().c_str());
806 Exiv2::IptcKey keyDigitizationTime(
"Iptc.Application2.DigitizationTime");
807 Exiv2::IptcData::iterator it2 = iptcData.findKey(keyDigitizationTime);
809 if (it2 != iptcData.end())
811 QString IptcTimeDigitization(it2->toString().c_str());
813 QDate date = QDate::fromString(IptcDateDigitization, Qt::ISODate);
814 QTime time = QTime::fromString(IptcTimeDigitization, Qt::ISODate);
815 QDateTime dateTime = QDateTime(date, time);
817 if (dateTime.isValid())
819 kDebug() <<
"Date (IPTC digitalized): " << dateTime.toString().toAscii().constData();
826 catch( Exiv2::Error& e )
831 if (fallbackToCreationTime)
842 if (preview.loadFromData(
getIptcTagData(
"Iptc.Application2.Preview")) )
847 catch( Exiv2::Error& e )
860 if (preview.isNull())
871 QBuffer buffer(&data);
872 buffer.open(QIODevice::WriteOnly);
875 preview.save(&buffer,
"JPEG");
876 kDebug() <<
"JPEG image preview size: (" << preview.width() <<
" x "
877 << preview.height() <<
") pixels - " << data.size() <<
" bytes";
879 Exiv2::DataValue val;
880 val.read((Exiv2::byte *)data.data(), data.size());
884 d->
iptcMetadata()[
"Iptc.Application2.PreviewFormat"] = 11;
885 d->
iptcMetadata()[
"Iptc.Application2.PreviewVersion"] = 1;
889 catch( Exiv2::Error& e )
const Exiv2::ExifData & exifMetadata() const
ImageColorWorkSpace
The image color workspace values given by Exif metadata.
const Exiv2::IptcData & iptcMetadata() const
bool setXmpTagString(const char *xmpTagName, const QString &value, bool setProgramName=true) const
Set a Xmp tag content using a string.
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.
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 removeIptcTag(const char *iptcTagName, bool setProgramName=true) const
Remove the all instance of Iptc tags 'iptcTagName' from Iptc metadata.
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.
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...