diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-02-10 10:46:00 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-02-11 09:29:17 +0000 |
commit | 58f19cf8d51e06f1781f3142e6d872e5feb0690e (patch) | |
tree | 30e6ae841e3e4d22f17e6aa43f19f4a89f681747 | |
parent | e4af63c68fa91d126ee3f8489058b14c9ee127a3 (diff) | |
download | qtimageformats-58f19cf8d51e06f1781f3142e6d872e5feb0690e.tar.gz |
Improve interpretation of undefined alpha-channels
Libtiff does not process the alpha-channel if its definition is not
specified. However to match how Qt used to save TIFF images and how
tested image viewers interpret them, we need to treat unspecified alpha
channels as unpremultiplied.
Task-number: QTBUG-50902
Change-Id: Id72218ed5bf702b54ffa3b5b47d6230facbfa0c4
Reviewed-by: aavit <eirik.aavitsland@theqtcompany.com>
-rw-r--r-- | src/plugins/imageformats/tiff/qtiffhandler.cpp | 15 | ||||
-rw-r--r-- | tests/auto/tiff/tst_qtiff.cpp | 1 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp index a6b87af..875ab16 100644 --- a/src/plugins/imageformats/tiff/qtiffhandler.cpp +++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp @@ -251,8 +251,19 @@ bool QTiffHandlerPrivate::openForRead(QIODevice *device) format = QImage::Format_Indexed8; else if (samplesPerPixel < 4) format = QImage::Format_RGB32; - else - format = QImage::Format_ARGB32_Premultiplied; + else { + uint16 count; + uint16 *extrasamples; + // If there is any definition of the alpha-channel, libtiff will return premultiplied + // data to us. If there is none, libtiff will not touch it and we assume it to be + // non-premultiplied, matching behavior of tested image editors, and how older Qt + // versions used to save it. + bool gotField = TIFFGetField(tiff, TIFFTAG_EXTRASAMPLES, &count, &extrasamples); + if (!gotField || !count || extrasamples[0] == EXTRASAMPLE_UNSPECIFIED) + format = QImage::Format_ARGB32; + else + format = QImage::Format_ARGB32_Premultiplied; + } headersRead = true; return true; diff --git a/tests/auto/tiff/tst_qtiff.cpp b/tests/auto/tiff/tst_qtiff.cpp index a77a735..d309c8d 100644 --- a/tests/auto/tiff/tst_qtiff.cpp +++ b/tests/auto/tiff/tst_qtiff.cpp @@ -346,6 +346,7 @@ void tst_qtiff::writeImage() QImageWriter writer(&buf, format); QVERIFY(writer.write(image)); } + image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); QImage image2; { |