419{
420 ioDevice->open(QIODevice::WriteOnly);
421 Exiv2::ExifData exifData;
423 QByteArray header(6, 0);
424 header[0] = 0x45;
425 header[1] = 0x78;
426 header[2] = 0x69;
427 header[3] = 0x66;
428 header[4] = 0x00;
429 header[5] = 0x00;
430 ioDevice->write(header);
431 }
432
434 try {
435 dbgMetaData <<
"Trying to save: " << entry.name() <<
" of " << entry.schema()->prefix() <<
":"
436 << entry.schema()->uri();
437 QString exivKey;
439 exivKey = "Exif.Image." + entry.name();
440 } else if (entry.schema()->uri()
442 if (entry.name().left(3) == "GPS") {
443 exivKey = "Exif.GPSInfo." + entry.name();
444 } else {
445 exivKey = "Exif.Photo." + entry.name();
446 }
448 if (entry.name() == "description") {
449 exivKey = "Exif.Image.ImageDescription";
450 } else if (entry.name() == "creator") {
451 exivKey = "Exif.Image.Artist";
452 } else if (entry.name() == "rights") {
453 exivKey = "Exif.Image.Copyright";
454 }
456 if (entry.name() == "ModifyDate") {
457 exivKey = "Exif.Image.DateTime";
458 } else if (entry.name() == "CreatorTool") {
459 exivKey = "Exif.Image.Software";
460 }
462 if (entry.name() == "RawData") {
463 exivKey = "Exif.Photo.MakerNote";
464 }
465 }
466 dbgMetaData <<
"Saving " << entry.name() <<
" to " << exivKey;
467 if (exivKey.isEmpty()) {
468 dbgMetaData << entry.qualifiedName() <<
" is unsavable to EXIF";
469 } else {
470 Exiv2::ExifKey exifKey(qPrintable(exivKey));
472 if (exivKey == "Exif.Photo.ExifVersion" || exivKey == "Exif.Photo.FlashpixVersion") {
474 } else if (exivKey == "Exif.Photo.FileSource") {
475 char s[] = {0x03};
476 v =
new Exiv2::DataValue((
const Exiv2::byte *)s, 1);
477 } else if (exivKey == "Exif.Photo.SceneType") {
478 char s[] = {0x01};
479 v =
new Exiv2::DataValue((
const Exiv2::byte *)s, 1);
480 } else if (exivKey == "Exif.Photo.ComponentsConfiguration") {
482 } else if (exivKey == "Exif.Image.Artist") {
484 if (entry.value().asArray().size() > 0) {
485 creator = entry.value().
asArray()[0];
486 }
487#if !EXIV2_TEST_VERSION(0, 21, 0)
489#else
491#endif
492 } else if (exivKey == "Exif.Photo.OECF") {
494 } else if (exivKey == "Exif.Photo.DeviceSettingDescription") {
496 } else if (exivKey == "Exif.Photo.CFAPattern") {
498 } else if (exivKey == "Exif.Photo.Flash") {
500 } else if (exivKey == "Exif.Photo.UserComment") {
502 QMap<QString, KisMetaData::Value> langArr = entry.value().asLangArray();
503 if (langArr.contains("x-default")) {
504#if !EXIV2_TEST_VERSION(0, 21, 0)
506 Exiv2::ExifTags::tagType(exifKey.tag(), exifKey.ifdId()));
507#else
509#endif
510 } else if (langArr.size() > 0) {
511#if !EXIV2_TEST_VERSION(0, 21, 0)
513 Exiv2::ExifTags::tagType(exifKey.tag(), exifKey.ifdId()));
514#else
516#endif
517 }
518 } else {
520#if !EXIV2_TEST_VERSION(0, 21, 0)
521 v =
kmdValueToExivValue(entry.value(), Exiv2::ExifTags::tagType(exifKey.tag(), exifKey.ifdId()));
522#else
524#endif
525 }
526 if (
v &&
v->typeId() != Exiv2::invalidTypeId) {
527 dbgMetaData <<
"Saving key" << exivKey <<
" of KMD value" << entry.value();
528 exifData.add(exifKey,
v);
529 } else {
530 dbgMetaData <<
"No exif value was created for" << entry.qualifiedName() <<
" as"
531 << exivKey;
532 }
533 }
534#if EXIV2_TEST_VERSION(0,28,0)
535 } catch (Exiv2::Error &e) {
536#else
537 } catch (Exiv2::AnyError &e) {
538#endif
540 }
541 }
542#if !EXIV2_TEST_VERSION(0, 18, 0)
543 Exiv2::DataBuf rawData = exifData.copy();
544 ioDevice->write((const char *)rawData.pData_, rawData.size_);
545#else
546 Exiv2::Blob rawData;
547 Exiv2::ExifParser::encode(rawData, Exiv2::littleEndian, exifData);
548 ioDevice->write((const char *)&*rawData.begin(), static_cast<int>(rawData.size()));
549#endif
550 ioDevice->close();
551 return true;
552}
Exiv2::Value * deviceSettingDescriptionKMDToExif(const KisMetaData::Value &value)
Exiv2::Value * kmdIntOrderedArrayToExifArray(const KisMetaData::Value &value)
Exiv2::Value * cfaPatternKMDToExif(const KisMetaData::Value &value)
Exiv2::Value * flashKMDToExif(const KisMetaData::Value &value)
Exiv2::Value * kmdOECFStructureToExifOECF(const KisMetaData::Value &value)
Exiv2::Value * kmdValueToExifVersion(const KisMetaData::Value &value)
Exiv2::Value * kmdValueToExivValue(const KisMetaData::Value &value, Exiv2::TypeId type)
Convert a KisMetaData to an Exiv value.