diff --git a/lib/jpegcontent.cpp b/lib/jpegcontent.cpp --- a/lib/jpegcontent.cpp +++ b/lib/jpegcontent.cpp @@ -49,6 +49,7 @@ #include "iodevicejpegsourcemanager.h" #include "exiv2imageloader.h" #include "gwenviewconfig.h" +#include "imageutils.h" namespace Gwenview { @@ -216,7 +217,7 @@ d->mFile.close(); d->mRawData.clear(); } - + d->mFile.setFileName(path); if (!d->mFile.open(QIODevice::ReadOnly)) { qCritical() << "Could not open '" << path << "' for reading\n"; @@ -572,6 +573,20 @@ Exiv2::DataBuf thumbnail = d->mExifData.copyThumbnail(); #endif image.loadFromData(thumbnail.pData_, thumbnail.size_); + + Exiv2::ExifKey key("Exif.Canon.ThumbnailImageValidArea"); + Exiv2::ExifData::iterator it = d->mExifData.findKey(key); + + // ensure ThumbnailImageValidArea actually specifies a rectangle, i.e. there must be 4 coordinates + if (it != d->mExifData.end() && it->count() == 4) { + QRect validArea(QPoint(it->toLong(0), it->toLong(2)), QPoint(it->toLong(1), it->toLong(3))); + image = image.copy(validArea); + } + + Orientation o = orientation(); + if (GwenviewConfig::applyExifOrientation() && o != NORMAL && o != NOT_AVAILABLE) { + image = image.transformed(ImageUtils::transformMatrix(o)); + } } return image; } @@ -611,7 +626,7 @@ d->mFile.unmap(mappedFile); d->mFile.close(); } - + QFile file(path); if (!file.open(QIODevice::WriteOnly)) { d->mErrorString = i18nc("@info", "Could not open file for writing."); diff --git a/lib/thumbnailprovider/thumbnailgenerator.cpp b/lib/thumbnailprovider/thumbnailgenerator.cpp --- a/lib/thumbnailprovider/thumbnailgenerator.cpp +++ b/lib/thumbnailprovider/thumbnailgenerator.cpp @@ -22,7 +22,6 @@ #include "thumbnailgenerator.h" // Local -#include "imageutils.h" #include "jpegcontent.h" #include "gwenviewconfig.h" #include "exiv2imageloader.h" @@ -61,7 +60,6 @@ { mImage = QImage(); mNeedCaching = true; - Orientation orientation = NORMAL; QImage originalImage; QSize originalSize; @@ -118,19 +116,11 @@ } // If there's jpeg content (from jpg or raw files), try to load an embedded thumbnail, if available. - // If applyExifOrientation is not set, don't use the - // embedded thumbnail since it might be rotated differently - // than the actual image - if (!content.rawData().isEmpty() && GwenviewConfig::applyExifOrientation()) { + if (!content.rawData().isEmpty()) { QImage thumbnail = content.thumbnail(); - orientation = content.orientation(); if (qMax(thumbnail.width(), thumbnail.height()) >= pixelSize) { - mImage = thumbnail; - if (orientation != NORMAL && orientation != NOT_AVAILABLE) { - QTransform matrix = ImageUtils::transformMatrix(orientation); - mImage = mImage.transformed(matrix); - } + mImage = std::move(thumbnail); mOriginalWidth = content.size().width(); mOriginalHeight = content.size().height(); return true;