From a0aa882dddcffb864614cb53a89e989f849e09e1 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Wed, 20 Apr 2022 16:06:51 +0300 Subject: [PATCH 01/11] rescale images according to the PhotoQuality setting set in the QGIS project (fix #841) --- app/inpututils.cpp | 10 +- app/inpututils.h | 5 + app/qml/ExternalResourceBundle.qml | 5 + core/core.pri | 6 +- core/imageutils.cpp | 142 +++++++++++++++++++++++++++++ core/imageutils.h | 33 +++++++ 6 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 core/imageutils.cpp create mode 100644 core/imageutils.h diff --git a/app/inpututils.cpp b/app/inpututils.cpp index f77b878f8..850acab06 100644 --- a/app/inpututils.cpp +++ b/app/inpututils.cpp @@ -38,6 +38,8 @@ #include "qgsunittypes.h" #include "qgsfeatureid.h" +#include "imageutils.h" + #include #include #include @@ -46,7 +48,6 @@ #include #include #include - #include static const QString DATE_TIME_FORMAT = QStringLiteral( "yyMMdd-hhmmss" ); @@ -1625,3 +1626,10 @@ QString InputUtils::iconFromGeometry( const QgsWkbTypes::GeometryType &geometry default: return QString( "qrc:/mIconTableLayer.svg" ); } } + +bool InputUtils::rescaleImage( const QString &path, QgsProject *activeProject ) +{ + qDebug() << "rescaleImage called"; + int quality = activeProject->readNumEntry( QStringLiteral( "Mergin" ), QStringLiteral( "PhotoQuality" ), 0 ); + return ImageUtils::rescale( path, quality ); +} diff --git a/app/inpututils.h b/app/inpututils.h index 30c25dd20..552af7827 100644 --- a/app/inpututils.h +++ b/app/inpututils.h @@ -450,6 +450,11 @@ class InputUtils: public QObject */ Q_INVOKABLE void zoomToProject( QgsProject *qgsProject, QgsQuickMapSettings *mapSettings ); + /** + * Rescales image according to the project photo quality setting. + */ + Q_INVOKABLE static bool rescaleImage( const QString &path, QgsProject *activeProject ); + signals: Q_INVOKABLE void showNotificationRequested( const QString &message ); diff --git a/app/qml/ExternalResourceBundle.qml b/app/qml/ExternalResourceBundle.qml index fb562a80c..4e1389450 100644 --- a/app/qml/ExternalResourceBundle.qml +++ b/app/qml/ExternalResourceBundle.qml @@ -97,6 +97,11 @@ Item { */ property var confirmImage: function confirmImage(itemWidget, prefixToRelativePath, value) { if (value) { + console.log("TRY TO RESCALE" + value) + if (!__inputUtils.rescaleImage(value, __activeProject.qgsProject)) + { + console.log("RESCALE FAILED" + value) + } var newCurrentValue = __inputUtils.getRelativePath(value, prefixToRelativePath) itemWidget.editorValueChanged(newCurrentValue, newCurrentValue === "" || newCurrentValue === null) } diff --git a/core/core.pri b/core/core.pri index 6667237b4..270c5e972 100644 --- a/core/core.pri +++ b/core/core.pri @@ -12,7 +12,8 @@ SOURCES += \ $$PWD/localprojectsmanager.cpp \ $$PWD/merginprojectmetadata.cpp \ $$PWD/project.cpp \ - $$PWD/geodiffutils.cpp + $$PWD/geodiffutils.cpp \ + $$PWD/imageutils.cpp HEADERS += \ $$PWD/coreutils.h \ @@ -27,7 +28,8 @@ HEADERS += \ $$PWD/localprojectsmanager.h \ $$PWD/merginprojectmetadata.h \ $$PWD/project.h \ - $$PWD/geodiffutils.h + $$PWD/geodiffutils.h \ + $$PWD/imageutils.h exists($$PWD/merginsecrets.cpp) { message("Using production Mergin API_KEYS") diff --git a/core/imageutils.cpp b/core/imageutils.cpp new file mode 100644 index 000000000..2d677e767 --- /dev/null +++ b/core/imageutils.cpp @@ -0,0 +1,142 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "imageutils.h" + +#include "coreutils.h" + +#include +#include +#include + +#include + +bool ImageUtils::copyExifMetadata( const QString &sourceImage, const QString &targetImage ) +{ + CoreUtils::log( "copy EXIF", QStringLiteral( "Copy EXIF from %1 to %2" ).arg( sourceImage, targetImage ) ); + + if ( !QFileInfo::exists( sourceImage ) || !QFileInfo::exists( targetImage ) ) + return false; + + try + { + std::unique_ptr< Exiv2::Image > srcImage( Exiv2::ImageFactory::open( sourceImage.toStdString() ) ); + if ( !srcImage ) + return false; + + std::unique_ptr< Exiv2::Image > dstImage( Exiv2::ImageFactory::open( targetImage.toStdString() ) ); + if ( !dstImage ) + return false; + + CoreUtils::log( "copy EXIF", QStringLiteral( "Read EXIF from source image" ) ); + srcImage->readMetadata(); + Exiv2::ExifData &exifData = srcImage->exifData(); + if ( exifData.empty() ) + { + return true; + } + + CoreUtils::log( "copy EXIF", QStringLiteral( "Write EXIF to target image" ) ); + dstImage->setExifData( exifData ); + dstImage->writeMetadata(); + CoreUtils::log( "copy EXIF", QStringLiteral( "Save target image metadata" ) ); + return true; + } + catch ( ... ) + { + CoreUtils::log( "copy EXIF", QStringLiteral( "FAILED to copy EXIF metadata" ) ); + return false; + } +} + +bool ImageUtils::rescale( const QString &path, int quality ) +{ + CoreUtils::log( "rescaling image", QStringLiteral( "Rescale %1 with quality %2" ).arg( path ).arg( quality ) ); + + QImage sourceImage( path ); + bool isPortrait = sourceImage.height() > sourceImage.width(); + int size = isPortrait ? sourceImage.width() : sourceImage.height(); + CoreUtils::log( "rescaling image", QStringLiteral( "Portrait orientation: %1" ).arg( isPortrait ) ); + CoreUtils::log( "rescaling image", QStringLiteral( "Original size: %1" ).arg( size ) ); + + int newSize = size; + switch ( quality ) + { + case 0: // original quality, no rescaling needed + { + break; + } + case 1: // high quality, output image size ~5Mb + { + newSize = 3000; + break; + } + case 2: // medium quality, output image size ~3Mb + { + newSize = 1500; + break; + } + case 3: // low quality, output image size ~1Mb + { + newSize = 800; + break; + } + } + + // if image width or height (depending on the orientation) is smaller + // than new size we keep original image + if ( size <= newSize ) + { + CoreUtils::log( "rescaling image", QStringLiteral( "Original size smaller than new size. No rescaling needed" ) ); + return true; + } + + // rescale + QImage rescaledImage; + if ( isPortrait ) + { + CoreUtils::log( "rescaling image", QStringLiteral( "Rescale to width" ) ); + rescaledImage = sourceImage.scaledToWidth( newSize, Qt::SmoothTransformation ); + } + else + { + CoreUtils::log( "rescaling image", QStringLiteral( "Rescale to height" ) ); + rescaledImage = sourceImage.scaledToHeight( newSize, Qt::SmoothTransformation ); + } + + if ( rescaledImage.isNull() ) + { + CoreUtils::log( "rescaling image", QStringLiteral( "FAILED to rescale" ) ); + return false; + } + + QFileInfo fi( path ); + QString newPath = QStringLiteral( "%1/%2_rescaled.%3" ).arg( fi.path(), fi.baseName(), fi.completeSuffix() ); + + if ( !rescaledImage.save( newPath ) ) + { + CoreUtils::log( "rescaling image", QStringLiteral( "FAILED to save rescaled image" ) ); + return false; + } + + // copy EXIF from source image to rescaled image + copyExifMetadata( path, newPath ); + + // remove original file and rename rescaled version + if ( QFile::remove( path ) ) + { + if ( QFile::rename( newPath, path ) ) + { + return true; + } + } + + CoreUtils::log( "rescaling image", QStringLiteral( "FAILED to replace original file with rescaled version" ) ); + return false; +} diff --git a/core/imageutils.h b/core/imageutils.h new file mode 100644 index 000000000..541d4a737 --- /dev/null +++ b/core/imageutils.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef IMAGEUTILS_H +#define IMAGEUTILS_H + +#include + +class ImageUtils +{ + public: + explicit ImageUtils( ) = default; + ~ImageUtils() = default; + + /** + * Copies EXIF metadata from sourceImage to targetImage. + */ + static bool copyExifMetadata( const QString &sourceImage, const QString &targetImage ); + + /** + * Rescales image to the given quality taking into account its orientation + * and preserving EXIF metadata. + */ + static bool rescale( const QString &path, int quality ); +}; + +#endif // IMAGEUTILS_H From aff0555e0194b11b818fcc7aa487877f2f5ff5b7 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Thu, 21 Apr 2022 09:34:41 +0300 Subject: [PATCH 02/11] add tests --- app/sources.pri | 6 +++-- app/test/inputtests.cpp | 6 +++++ app/test/testimageutils.cpp | 50 ++++++++++++++++++++++++++++++++++++ app/test/testimageutils.h | 26 +++++++++++++++++++ scripts/run_all_tests.bash | 3 +++ test/test_data/photo.jpg | Bin 0 -> 507804 bytes 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 app/test/testimageutils.cpp create mode 100644 app/test/testimageutils.h create mode 100644 test/test_data/photo.jpg diff --git a/app/sources.pri b/app/sources.pri index 415d0d91f..71251fe7c 100644 --- a/app/sources.pri +++ b/app/sources.pri @@ -134,7 +134,8 @@ contains(DEFINES, INPUT_TEST) { test/testvariablesmanager.cpp \ test/testformeditors.cpp \ test/testmodels.cpp \ - test/testcoreutils.cpp + test/testcoreutils.cpp \ + test/testimageutils.cpp HEADERS += \ test/inputtests.h \ @@ -153,7 +154,8 @@ contains(DEFINES, INPUT_TEST) { test/testvariablesmanager.h \ test/testformeditors.h \ test/testmodels.h \ - test/testcoreutils.h + test/testcoreutils.h \ + test/testimageutils.h } contains(DEFINES, APPLE_PURCHASING) { diff --git a/app/test/inputtests.cpp b/app/test/inputtests.cpp index 354822770..aa082defc 100644 --- a/app/test/inputtests.cpp +++ b/app/test/inputtests.cpp @@ -25,6 +25,7 @@ #include "test/testformeditors.h" #include "test/testmodels.h" #include "test/testcoreutils.h" +#include "test/testimageutils.h" #if not defined APPLE_PURCHASING #include "test/testpurchasing.h" @@ -160,6 +161,11 @@ int InputTests::runTest() const TestCoreUtils coreUtilsTest; nFailed = QTest::qExec( &coreUtilsTest, mTestArgs ); } + else if ( mTestRequested == "--testImageUtils" ) + { + TestImageUtils imageUtilsTest; + nFailed = QTest::qExec( &imageUtilsTest, mTestArgs ); + } #if not defined APPLE_PURCHASING else if ( mTestRequested == "--testPurchasing" ) { diff --git a/app/test/testimageutils.cpp b/app/test/testimageutils.cpp new file mode 100644 index 000000000..c3c23fcc7 --- /dev/null +++ b/app/test/testimageutils.cpp @@ -0,0 +1,50 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "testimageutils.h" +#include "testutils.h" +#include "imageutils.h" + +#include +#include +#include + +#include + +void TestImageUtils::init() +{ +} + +void TestImageUtils::cleanup() +{ +} + +void TestImageUtils::testRescale() +{ + QTemporaryDir dir; + QString testPhotoName = QStringLiteral( "photo.jpg" ); + QFile::copy( TestUtils::testDataDir() + '/' + testPhotoName, dir.filePath( testPhotoName ) ); + + QVERIFY( ImageUtils::rescale( dir.filePath( testPhotoName ), 3 ) ); + + QImage img( dir.filePath( testPhotoName ) ); + QCOMPARE( img.height(), 800 ); + + // check EXIF tags + std::unique_ptr< Exiv2::Image > image( Exiv2::ImageFactory::open( dir.filePath( testPhotoName ).toStdString() ) ); + + image->readMetadata(); + Exiv2::ExifData &exifData = image->exifData(); + QVERIFY( !exifData.empty() ); + + const Exiv2::ExifData::iterator itElevVal = exifData.findKey( Exiv2::ExifKey( "Exif.GPSInfo.GPSAltitude" ) ); + const Exiv2::Rational rational = itElevVal->value().toRational( 0 ); + double val = static_cast< double >( rational.first ) / rational.second; + QCOMPARE(val, 133); +} diff --git a/app/test/testimageutils.h b/app/test/testimageutils.h new file mode 100644 index 000000000..6e7f4450d --- /dev/null +++ b/app/test/testimageutils.h @@ -0,0 +1,26 @@ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TESTIMAGEUTILS_H +#define TESTIMAGEUTILS_H + +#include + +class TestImageUtils : public QObject +{ + Q_OBJECT + + private slots: + void init(); // will be called before each testfunction is executed. + void cleanup(); // will be called after every testfunction. + + void testRescale(); +}; + +#endif // TESTIMAGEUTILS_H diff --git a/scripts/run_all_tests.bash b/scripts/run_all_tests.bash index 7a77ce7aa..1c71d6e7f 100755 --- a/scripts/run_all_tests.bash +++ b/scripts/run_all_tests.bash @@ -51,6 +51,9 @@ NFAILURES=$(($NFAILURES+$?)) $INPUT_EXECUTABLE --testCoreUtils NFAILURES=$(($NFAILURES+$?)) +$INPUT_EXECUTABLE --testImageUtils +NFAILURES=$(($NFAILURES+$?)) + echo "Total $NFAILURES failures found in testing" exit $NFAILURES diff --git a/test/test_data/photo.jpg b/test/test_data/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4b7f3d3b298cec4d49e16e47dca24ec67187755 GIT binary patch literal 507804 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