diff --git a/lib/imageoperation.cpp b/lib/imageoperation.cpp index 39771ea..8c92f27 100644 --- a/lib/imageoperation.cpp +++ b/lib/imageoperation.cpp @@ -210,7 +210,9 @@ QString ImageOperation::scaleImage(const QString &sourceFile, qreal scaleFactor, } if (!image.save(tmpFile)) { - qWarning() << Q_FUNC_INFO << "Failed to save scaled image to temp file!"; + qWarning() << Q_FUNC_INFO + << "Failed to save scaled image to temp file!" + << tmpFile; return QString(); } @@ -280,13 +282,18 @@ QString ImageOperation::scaleImageToSize(const QString &sourceFile, quint64 targ qreal a = originalSize / (w * h * 1.0); // The magic number, which combines depth and compression qint32 newWidth = qSqrt((targetSize * r) / a); - qint32 newHeight = r / newWidth; + qint32 newHeight = newWidth / r; QSize imageSize(ir.size()); imageSize = imageSize.scaled(newWidth, newHeight, Qt::KeepAspectRatio); ir.setScaledSize(imageSize); QImage image = ir.read(); + if (image.isNull()) { + qWarning() << Q_FUNC_INFO + << "NULL image"; + return QString(); + } // Make sure orientation is right. int angle; bool mirrored; @@ -303,7 +310,9 @@ QString ImageOperation::scaleImageToSize(const QString &sourceFile, quint64 targ } if (!image.save(tmpFile)) { - qWarning() << Q_FUNC_INFO << "Failed to save scaled image to temp file!"; + qWarning() << Q_FUNC_INFO + << "Failed to save scaled image to temp file!" + << tmpFile; return QString(); } @@ -312,8 +321,15 @@ QString ImageOperation::scaleImageToSize(const QString &sourceFile, quint64 targ void ImageOperation::imageOrientation(const QString &sourceFile, int &angle, bool *mirror) { + if(!QuillMetadata::canRead(sourceFile)) { + qWarning() << Q_FUNC_INFO << "Can't read metadata"; + angle = 0; + mirror = false; + return; + } QuillMetadata md(sourceFile); - if (!md.isValid() || !md.hasExif()) { + if (!md.hasExif()) { + qWarning() << "Metadata invalid"; angle = 0; mirror = false; return; diff --git a/tests/images/testimage-0-mirrored.jpg b/tests/images/testimage-0-mirrored.jpg new file mode 100644 index 0000000..7dcdf57 Binary files /dev/null and b/tests/images/testimage-0-mirrored.jpg differ diff --git a/tests/images/testimage-0.jpg b/tests/images/testimage-0.jpg new file mode 100644 index 0000000..27d5680 Binary files /dev/null and b/tests/images/testimage-0.jpg differ diff --git a/tests/images/testimage-180-mirrored.jpg b/tests/images/testimage-180-mirrored.jpg new file mode 100644 index 0000000..ed489cc Binary files /dev/null and b/tests/images/testimage-180-mirrored.jpg differ diff --git a/tests/images/testimage-180.jpg b/tests/images/testimage-180.jpg new file mode 100644 index 0000000..6384414 Binary files /dev/null and b/tests/images/testimage-180.jpg differ diff --git a/tests/images/testimage-270-mirrored.jpg b/tests/images/testimage-270-mirrored.jpg new file mode 100644 index 0000000..a952a3f Binary files /dev/null and b/tests/images/testimage-270-mirrored.jpg differ diff --git a/tests/images/testimage-270.jpg b/tests/images/testimage-270.jpg new file mode 100644 index 0000000..1a64902 Binary files /dev/null and b/tests/images/testimage-270.jpg differ diff --git a/tests/images/testimage-90-mirrored.jpg b/tests/images/testimage-90-mirrored.jpg new file mode 100644 index 0000000..ccaae47 Binary files /dev/null and b/tests/images/testimage-90-mirrored.jpg differ diff --git a/tests/images/testimage-90.jpg b/tests/images/testimage-90.jpg new file mode 100644 index 0000000..2c48d30 Binary files /dev/null and b/tests/images/testimage-90.jpg differ diff --git a/tests/images/testimage-90.jpg.jpg b/tests/images/testimage-90.jpg.jpg new file mode 100644 index 0000000..6c955f6 Binary files /dev/null and b/tests/images/testimage-90.jpg.jpg differ diff --git a/tests/tests.pro b/tests/tests.pro index 7bbdc91..d310690 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -49,7 +49,7 @@ tests_install.path = $$PATH tests_install.files = $$tests_xml.target tests_install.CONFIG += no_check_exist -resources.files = images/testimage.jpg +resources.files = images/*.jpg resources.path = $$PATH/images target.path = $$PATH diff --git a/tests/ut_imageoperation.cpp b/tests/ut_imageoperation.cpp index 2bbbe57..2580a51 100644 --- a/tests/ut_imageoperation.cpp +++ b/tests/ut_imageoperation.cpp @@ -114,17 +114,29 @@ void ut_imageoperation::testScale() QString result = ImageOperation::scaleImage(filePath, 0.5, target); QCOMPARE(result, target); + int angle; + bool mirror; + ImageOperation::imageOrientation(filePath, angle, &mirror); + QCOMPARE(angle, 90); + QCOMPARE(mirror, false); + QImage resImage(result); + QTransform x; + x.rotate(angle); + resImage = resImage.transformed(x); + QCOMPARE(resImage.size(), img.size()*0.5); QFile::remove(result); result = ImageOperation::scaleImage(filePath, 0.1, target); resImage.load(result); + resImage = resImage.transformed(x); QCOMPARE(resImage.size(), img.size()*0.1); QFile::remove(result); result = ImageOperation::scaleImage(filePath, 0.9, target); resImage.load(result); + resImage = resImage.transformed(x); QVERIFY(qAbs(resImage.width() - img.width()*0.9) < 2); QVERIFY(qAbs(resImage.height() - img.height()*0.9) < 2); QFile::remove(result); @@ -139,7 +151,20 @@ void ut_imageoperation::testScaleToSize() QString filePath("images/testimage.jpg"); QString target = ImageOperation::uniqueFilePath(filePath); + QVERIFY(!target.isEmpty()); + QFileInfo f("images/testimage.jpg"); + + int angle; + bool mirror; + ImageOperation::imageOrientation(filePath, angle, &mirror); + QCOMPARE(angle, 90); + QCOMPARE(mirror, false); + + QTransform x; + x.rotate(angle); + img = img.transformed(x); + int targetSize = f.size() * 0.5; // Invalid sourceFile -> fail @@ -216,6 +241,43 @@ void ut_imageoperation::testDropMetadata() QFile::remove(path); } +void ut_imageoperation::testOrientation() +{ + int angle; + bool mirrored; + ImageOperation::imageOrientation("images/testimage-0.jpg", angle, &mirrored); + QCOMPARE(angle, 0); + QCOMPARE(mirrored, false); + + ImageOperation::imageOrientation("images/testimage-0-mirrored.jpg", angle, &mirrored); + QCOMPARE(angle, 0); + QCOMPARE(mirrored, true); + + ImageOperation::imageOrientation("images/testimage-90.jpg", angle, &mirrored); + QCOMPARE(angle, 90); + QCOMPARE(mirrored, false); + + ImageOperation::imageOrientation("images/testimage-90-mirrored.jpg", angle, &mirrored); + QCOMPARE(angle, 90); + QCOMPARE(mirrored, true); + + ImageOperation::imageOrientation("images/testimage-180.jpg", angle, &mirrored); + QCOMPARE(angle, 180); + QCOMPARE(mirrored, false); + + ImageOperation::imageOrientation("images/testimage-180-mirrored.jpg", angle, &mirrored); + QCOMPARE(angle, 180); + QCOMPARE(mirrored, true); + + ImageOperation::imageOrientation("images/testimage-270.jpg", angle, &mirrored); + QCOMPARE(angle, 270); + QCOMPARE(mirrored, false); + + ImageOperation::imageOrientation("images/testimage-270-mirrored.jpg", angle, &mirrored); + QCOMPARE(angle, 270); + QCOMPARE(mirrored, true); +} + /* QTEST_MAIN(ut_imageoperation) diff --git a/tests/ut_imageoperation.h b/tests/ut_imageoperation.h index 01de8a1..09f7a08 100644 --- a/tests/ut_imageoperation.h +++ b/tests/ut_imageoperation.h @@ -41,6 +41,7 @@ private slots: void testScaleToSize(); void testDropMetadata(); void testUniqueFilePath(); + void testOrientation(); }; #endif // UT_IMAGEOPERATION_H