diff --git a/app/imageutils.cpp b/app/imageutils.cpp index 30ec55681..2358489d6 100644 --- a/app/imageutils.cpp +++ b/app/imageutils.cpp @@ -150,24 +150,41 @@ bool ImageUtils::clearOrientationMetadata( const QString &sourceImage ) return false; srcImage->readMetadata(); + bool metadataModified = false; + Exiv2::ExifData &exifData = srcImage->exifData(); - if ( exifData.empty() ) + if ( !exifData.empty() ) { - return true; + const auto exifIt = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); + if ( exifIt != exifData.end() ) + { + exifIt->setValue( "1" ); // 1 = no rotation + metadataModified = true; + } + } + + Exiv2::XmpData &xmpData = srcImage->xmpData(); + if ( !xmpData.empty() ) + { + const auto xmpIt = xmpData.findKey( Exiv2::XmpKey( "Xmp.tiff.Orientation" ) ); + if ( xmpIt != xmpData.end() ) + { + xmpIt->setValue( "1" ); + metadataModified = true; + } } - const auto iterator = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); - if ( iterator != exifData.end() ) + // Only write to disk if we actually changed something + if ( metadataModified ) { - exifData.erase( iterator ); + srcImage->writeMetadata(); } - srcImage->setExifData( exifData ); - srcImage->writeMetadata(); + return true; } - catch ( ... ) + catch ( const Exiv2::Error &e ) { - CoreUtils::log( "Editing EXIF", QStringLiteral( "Failed to clear orientation EXIF metadata" ) ); + CoreUtils::log( "Editing EXIF", QStringLiteral( "Failed to clear orientation: " ).arg( e.what() ) ); return false; } } diff --git a/app/test/testimageutils.cpp b/app/test/testimageutils.cpp index 1a3238097..35e06ab9b 100644 --- a/app/test/testimageutils.cpp +++ b/app/test/testimageutils.cpp @@ -53,6 +53,16 @@ void TestImageUtils::testClearOrientationMetadata() const QString testPhotoName = QStringLiteral( "photo.jpg" ); QFile::copy( TestUtils::testDataDir() + '/' + testPhotoName, dir.filePath( testPhotoName ) ); + // Set XMP orientation so the XMP code path is checked as well + { + const std::unique_ptr setupImage( Exiv2::ImageFactory::open( dir.filePath( testPhotoName ).toStdString() ) ); + setupImage->readMetadata(); + Exiv2::XmpData &xmpSetup = setupImage->xmpData(); + xmpSetup["Xmp.tiff.Orientation"] = uint16_t( 6 ); // 6 = 90° CW rotation + setupImage->setXmpData( xmpSetup ); + setupImage->writeMetadata(); + } + QVERIFY( ImageUtils::clearOrientationMetadata( dir.filePath( testPhotoName ) ) ); const std::unique_ptr image( Exiv2::ImageFactory::open( dir.filePath( testPhotoName ).toStdString() ) ); @@ -60,6 +70,12 @@ void TestImageUtils::testClearOrientationMetadata() Exiv2::ExifData &exifData = image->exifData(); QVERIFY( !exifData.empty() ); - const auto iterator = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); - QVERIFY( iterator == exifData.end() ); + const auto exifIterator = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); + QVERIFY( exifIterator != exifData.end() ); // key should be preserved, just reset to 1 + QCOMPARE( QString::fromStdString( exifIterator->toString() ), QStringLiteral( "1" ) ); + + Exiv2::XmpData &xmpData = image->xmpData(); + const auto xmpIterator = xmpData.findKey( Exiv2::XmpKey( "Xmp.tiff.Orientation" ) ); + QVERIFY( xmpIterator != xmpData.end() ); // key should be preserved, just reset to 1 + QCOMPARE( QString::fromStdString( xmpIterator->toString() ), QStringLiteral( "1" ) ); }