From 434aa248ad5710c7f65283fc3beb7e8adb8b1ad7 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Tue, 26 Feb 2019 16:23:08 +0100 Subject: Heic handler: fix orientation and other image properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mac heic handler lacked support for any meta-data i/o. Most notably, the image orientation proprty was ignored, so images read in could be wrongly oriented. Fixes: QTBUG-73415 Change-Id: I779f91dc28c7441b124aab4557e1abcd3e69fde9 Reviewed-by: Morten Johan Sørvig --- tests/auto/heif/tst_qheif.cpp | 80 ++++++++++++++++++++++++++++++- tests/shared/images/heif.qrc | 1 + tests/shared/images/heif/newlogoCCW.heic | Bin 0 -> 4847 bytes 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/shared/images/heif/newlogoCCW.heic (limited to 'tests') diff --git a/tests/auto/heif/tst_qheif.cpp b/tests/auto/heif/tst_qheif.cpp index faf22fa..26ddf73 100644 --- a/tests/auto/heif/tst_qheif.cpp +++ b/tests/auto/heif/tst_qheif.cpp @@ -37,6 +37,9 @@ private slots: void initTestCase(); void readImage_data(); void readImage(); + void readProperties_data(); + void readProperties(); + void writeImage(); }; void tst_qheif::initTestCase() @@ -49,8 +52,10 @@ void tst_qheif::readImage_data() { QTest::addColumn("fileName"); QTest::addColumn("size"); + QTest::addColumn("transform"); - QTest::newRow("col") << QString("col320x480.heic") << QSize(320, 480); + QTest::newRow("col") << QString("col320x480.heic") << QSize(320, 480) << int(QImageIOHandler::TransformationNone); + QTest::newRow("rot") << QString("newlogoCCW.heic") << QSize(110, 78) << int(QImageIOHandler::TransformationRotate90); } void tst_qheif::readImage() @@ -66,5 +71,78 @@ void tst_qheif::readImage() QCOMPARE(image.size(), size); } +void tst_qheif::readProperties_data() +{ + readImage_data(); +} + +void tst_qheif::readProperties() +{ + QFETCH(QString, fileName); + QFETCH(QSize, size); + QFETCH(int, transform); + + QSize rawSize = (transform & QImageIOHandler::TransformationRotate90) ? size.transposed() : size; + + QString path = QStringLiteral(":/heif/") + fileName; + QImageReader reader(path); + QCOMPARE(reader.size(), rawSize); + QCOMPARE(int(reader.transformation()), transform); + + QImage image = reader.read(); + QCOMPARE(image.size(), size); + + QCOMPARE(reader.size(), rawSize); + QCOMPARE(int(reader.transformation()), transform); +} + +void tst_qheif::writeImage() +{ + QImage img(20, 10, QImage::Format_ARGB32_Premultiplied); + img.fill(Qt::green); + + QBuffer buf1, buf2; + QImage rimg1; + + { + buf1.open(QIODevice::WriteOnly); + QImageWriter writer(&buf1, "heic"); + QVERIFY(writer.write(img)); + buf1.close(); + QVERIFY(buf1.size() > 0); + + buf1.open(QIODevice::ReadOnly); + QImageReader reader(&buf1); + QVERIFY(reader.read(&rimg1)); + buf1.close(); + QVERIFY(rimg1.size() == img.size()); + } + + { + buf2.open(QIODevice::WriteOnly); + QImageWriter writer(&buf2, "heic"); + writer.setQuality(20); + QVERIFY(writer.write(img)); + buf2.close(); + QVERIFY(buf2.size() > 0); + QVERIFY(buf2.size() < buf1.size()); + } + + { + buf2.open(QIODevice::WriteOnly); + QImageWriter writer(&buf2, "heic"); + writer.setTransformation(QImageIOHandler::TransformationRotate270); + QVERIFY(writer.write(img)); + buf2.close(); + + QImage rimg2; + buf2.open(QIODevice::ReadOnly); + QImageReader reader(&buf2); + QVERIFY(reader.read(&rimg2)); + buf2.close(); + QVERIFY(rimg2.size() == img.size().transposed()); + } +} + QTEST_MAIN(tst_qheif) #include "tst_qheif.moc" diff --git a/tests/shared/images/heif.qrc b/tests/shared/images/heif.qrc index 2a41c36..8232b6a 100644 --- a/tests/shared/images/heif.qrc +++ b/tests/shared/images/heif.qrc @@ -1,5 +1,6 @@ heif/col320x480.heic + heif/newlogoCCW.heic diff --git a/tests/shared/images/heif/newlogoCCW.heic b/tests/shared/images/heif/newlogoCCW.heic new file mode 100644 index 0000000..1604947 Binary files /dev/null and b/tests/shared/images/heif/newlogoCCW.heic differ -- cgit v1.2.1