From dfc7b71af00fa527571146f562ca02c16e97cb3c Mon Sep 17 00:00:00 2001 From: Gabriel Bolbotina Date: Tue, 3 Mar 2026 12:24:28 +0200 Subject: [PATCH 1/2] Fixed android clear orientation function --- app/imageutils.cpp | 36 +++++++++++++++++++++++++++++------- app/test/testimageutils.cpp | 20 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/app/imageutils.cpp b/app/imageutils.cpp index 30ec55681..2ac6b0d81 100644 --- a/app/imageutils.cpp +++ b/app/imageutils.cpp @@ -150,21 +150,43 @@ 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; + 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() ) + { + 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 ( const Exiv2::Error &e ) + { + CoreUtils::log( "Editing EXIF", QStringLiteral( "Failed to clear orientation: " ) + QString::fromStdString( e.what() ) ); + return false; + } catch ( ... ) { CoreUtils::log( "Editing EXIF", QStringLiteral( "Failed to clear orientation EXIF metadata" ) ); 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" ) ); } From 12324c946c4f4051532c6de9d37a13f958b16a42 Mon Sep 17 00:00:00 2001 From: Gabriel Bolbotina Date: Tue, 10 Mar 2026 09:34:50 +0200 Subject: [PATCH 2/2] Implemented code findings --- app/imageutils.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/app/imageutils.cpp b/app/imageutils.cpp index 2ac6b0d81..2358489d6 100644 --- a/app/imageutils.cpp +++ b/app/imageutils.cpp @@ -155,7 +155,7 @@ bool ImageUtils::clearOrientationMetadata( const QString &sourceImage ) Exiv2::ExifData &exifData = srcImage->exifData(); if ( !exifData.empty() ) { - auto exifIt = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); + const auto exifIt = exifData.findKey( Exiv2::ExifKey( "Exif.Image.Orientation" ) ); if ( exifIt != exifData.end() ) { exifIt->setValue( "1" ); // 1 = no rotation @@ -166,7 +166,7 @@ bool ImageUtils::clearOrientationMetadata( const QString &sourceImage ) Exiv2::XmpData &xmpData = srcImage->xmpData(); if ( !xmpData.empty() ) { - auto xmpIt = xmpData.findKey( Exiv2::XmpKey( "Xmp.tiff.Orientation" ) ); + const auto xmpIt = xmpData.findKey( Exiv2::XmpKey( "Xmp.tiff.Orientation" ) ); if ( xmpIt != xmpData.end() ) { xmpIt->setValue( "1" ); @@ -184,12 +184,7 @@ bool ImageUtils::clearOrientationMetadata( const QString &sourceImage ) } catch ( const Exiv2::Error &e ) { - CoreUtils::log( "Editing EXIF", QStringLiteral( "Failed to clear orientation: " ) + QString::fromStdString( e.what() ) ); - return false; - } - catch ( ... ) - { - 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; } }