//------------------------------------------------------------------------ // // ThumbnailContext // //------------------------------------------------------------------------ bool ThumbnailContext::load(const QString &pixPath, int pixelSize) { mImage = QImage(); mNeedCaching = true; Orientation orientation = NORMAL; QImageReader reader(pixPath); if (!reader.canRead()) { reader.setDecideFormatFromContent(true); // Set filename again, otherwise QImageReader won't restart from scratch reader.setFileName(pixPath); } // If it's a Jpeg, 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 (reader.format() == "jpeg" && GwenviewConfig::applyExifOrientation()) { JpegContent content; content.load(pixPath); QImage thumbnail = content.thumbnail(); orientation = content.orientation(); if (qMax(thumbnail.width(), thumbnail.height()) >= pixelSize) { mImage = thumbnail; if (orientation != NORMAL && orientation != NOT_AVAILABLE) { QMatrix matrix = ImageUtils::transformMatrix(orientation); mImage = mImage.transformed(matrix); } mOriginalWidth = content.size().width(); mOriginalHeight = content.size().height(); return true; } } // Generate thumbnail from full image QSize originalSize = reader.size(); if (originalSize.isValid() && reader.supportsOption(QImageIOHandler::ScaledSize)) { QSizeF scaledSize = originalSize; scaledSize.scale(pixelSize, pixelSize, Qt::KeepAspectRatio); if (!scaledSize.isEmpty()) { reader.setScaledSize(scaledSize.toSize()); } } QImage originalImage; // format() is empty after QImageReader::read() is called QByteArray format = reader.format(); if (!reader.read(&originalImage)) { return false; } if (!originalSize.isValid()) { originalSize = originalImage.size(); } mOriginalWidth = originalSize.width(); mOriginalHeight = originalSize.height(); if (qMax(mOriginalWidth, mOriginalHeight) <= pixelSize) { mImage = originalImage; mNeedCaching = format != "png"; } else { mImage = originalImage.scaled(pixelSize, pixelSize, Qt::KeepAspectRatio); } // Rotate if necessary if (orientation != NORMAL && orientation != NOT_AVAILABLE && GwenviewConfig::applyExifOrientation()) { QMatrix matrix = ImageUtils::transformMatrix(orientation); mImage = mImage.transformed(matrix); switch (orientation) { case TRANSPOSE: case ROT_90: case TRANSVERSE: case ROT_270: qSwap(mOriginalWidth, mOriginalHeight); break; default: break; } } return true; }
bool ThumbnailThread::loadThumbnail(bool* needCaching) { mImage = QImage(); *needCaching = true; int pixelSize = ThumbnailGroup::pixelSize(mThumbnailGroup); Orientation orientation = NORMAL; QImageReader reader(mPixPath); // If it's a Jpeg, try to load an embedded thumbnail, if available if (reader.format() == "jpeg") { JpegContent content; content.load(mPixPath); QImage thumbnail = content.thumbnail(); orientation = content.orientation(); if (qMax(thumbnail.width(), thumbnail.height()) >= pixelSize) { mImage = thumbnail; if (orientation != NORMAL && orientation != NOT_AVAILABLE) { QMatrix matrix = ImageUtils::transformMatrix(orientation); mImage = mImage.transformed(matrix); } mOriginalWidth = content.size().width(); mOriginalHeight = content.size().height(); return true; } } // Generate thumbnail from full image QSize originalSize = reader.size(); if (originalSize.isValid() && reader.supportsOption(QImageIOHandler::ScaledSize)) { int scale; const int maxSize = qMax(originalSize.width(), originalSize.height()); for (scale = 1; pixelSize*scale * 2 <= maxSize && scale <= 8; scale *= 2) {} const QSize scaledSize = originalSize / scale; if (!scaledSize.isEmpty()) { reader.setScaledSize(scaledSize); } } QImage originalImage; // format() is empty after QImageReader::read() is called QByteArray format = reader.format(); if (!reader.read(&originalImage)) { kWarning() << "Could not generate thumbnail for file" << mOriginalUri; return false; } if (!originalSize.isValid()) { originalSize = originalImage.size(); } mOriginalWidth = originalSize.width(); mOriginalHeight = originalSize.height(); if (qMax(mOriginalWidth, mOriginalHeight) <= pixelSize) { mImage = originalImage; *needCaching = format != "png"; } else { mImage = originalImage.scaled(pixelSize, pixelSize, Qt::KeepAspectRatio); } // Rotate if necessary if (orientation != NORMAL && orientation != NOT_AVAILABLE) { QMatrix matrix = ImageUtils::transformMatrix(orientation); mImage = mImage.transformed(matrix); switch (orientation) { case TRANSPOSE: case ROT_90: case TRANSVERSE: case ROT_270: qSwap(mOriginalWidth, mOriginalHeight); break; default: break; } } return true; }