Move scaleImage() in Utils

This commit is contained in:
Konstantinos Sideris 2018-02-19 23:32:37 +02:00
parent 8b139c32a3
commit 1764bacd4b
5 changed files with 46 additions and 59 deletions

View File

@ -26,4 +26,32 @@ firstChar(const QString &input);
//! Get a human readable file size with the appropriate units attached. //! Get a human readable file size with the appropriate units attached.
QString QString
humanReadableFileSize(uint64_t bytes); humanReadableFileSize(uint64_t bytes);
//! Scale down an image to fit to the given width & height limitations.
template<class ImageType>
ImageType
scaleDown(uint64_t max_width, uint64_t max_height, const ImageType &source)
{
if (source.isNull())
return source;
auto width_ratio = (double)max_width / (double)source.width();
auto height_ratio = (double)max_height / (double)source.height();
auto min_aspect_ratio = std::min(width_ratio, height_ratio);
int final_width = 0;
int final_height = 0;
if (min_aspect_ratio > 1) {
final_width = source.width();
final_height = source.height();
} else {
final_width = source.width() * min_aspect_ratio;
final_height = source.height() * min_aspect_ratio;
}
return source.scaled(
final_width, final_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
} }

View File

@ -37,8 +37,6 @@ signals:
void closing(); void closing();
private: private:
void scaleImage(int width, int height);
QPixmap originalImage_; QPixmap originalImage_;
QPixmap image_; QPixmap image_;

View File

@ -53,7 +53,6 @@ private slots:
void imageDownloaded(const QString &event_id, const QPixmap &img); void imageDownloaded(const QString &event_id, const QPixmap &img);
private: private:
void scaleImage();
void openUrl(); void openUrl();
int max_width_ = 500; int max_width_ = 500;

View File

@ -19,6 +19,7 @@
#include <QDesktopWidget> #include <QDesktopWidget>
#include <QPainter> #include <QPainter>
#include "Utils.h"
#include "dialogs/ImageOverlay.h" #include "dialogs/ImageOverlay.h"
using namespace dialogs; using namespace dialogs;
@ -47,33 +48,6 @@ ImageOverlay::ImageOverlay(QPixmap image, QWidget *parent)
raise(); raise();
} }
// TODO: Move this into Utils
void
ImageOverlay::scaleImage(int max_width, int max_height)
{
if (originalImage_.isNull())
return;
auto width_ratio = (double)max_width / (double)originalImage_.width();
auto height_ratio = (double)max_height / (double)originalImage_.height();
auto min_aspect_ratio = std::min(width_ratio, height_ratio);
int final_width = 0;
int final_height = 0;
if (min_aspect_ratio > 1) {
final_width = originalImage_.width();
final_height = originalImage_.height();
} else {
final_width = originalImage_.width() * min_aspect_ratio;
final_height = originalImage_.height() * min_aspect_ratio;
}
image_ = originalImage_.scaled(
final_width, final_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
void void
ImageOverlay::paintEvent(QPaintEvent *event) ImageOverlay::paintEvent(QPaintEvent *event)
{ {
@ -93,7 +67,7 @@ ImageOverlay::paintEvent(QPaintEvent *event)
int max_width = screen_.width() - 2 * outer_margin; int max_width = screen_.width() - 2 * outer_margin;
int max_height = screen_.height(); int max_height = screen_.height();
scaleImage(max_width, max_height); image_ = utils::scaleDown<QPixmap>(max_width, max_height, originalImage_);
int diff_x = max_width - image_.width(); int diff_x = max_width - image_.width();
int diff_y = max_height - image_.height(); int diff_y = max_height - image_.height();

View File

@ -23,6 +23,7 @@
#include <QPixmap> #include <QPixmap>
#include "Config.h" #include "Config.h"
#include "Utils.h"
#include "dialogs/ImageOverlay.h" #include "dialogs/ImageOverlay.h"
#include "timeline/widgets/ImageItem.h" #include "timeline/widgets/ImageItem.h"
@ -113,30 +114,6 @@ ImageItem::openUrl()
qWarning() << "Could not open url" << url_.toString(); qWarning() << "Could not open url" << url_.toString();
} }
void
ImageItem::scaleImage()
{
if (image_.isNull())
return;
auto width_ratio = (double)max_width_ / (double)image_.width();
auto height_ratio = (double)max_height_ / (double)image_.height();
auto min_aspect_ratio = std::min(width_ratio, height_ratio);
if (min_aspect_ratio > 1) {
width_ = image_.width();
height_ = image_.height();
} else {
width_ = image_.width() * min_aspect_ratio;
height_ = image_.height() * min_aspect_ratio;
}
setFixedSize(width_, height_);
scaled_image_ =
image_.scaled(width_, height_, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
QSize QSize
ImageItem::sizeHint() const ImageItem::sizeHint() const
{ {
@ -149,8 +126,13 @@ ImageItem::sizeHint() const
void void
ImageItem::setImage(const QPixmap &image) ImageItem::setImage(const QPixmap &image)
{ {
image_ = image; image_ = image;
scaleImage(); scaled_image_ = utils::scaleDown<QPixmap>(max_width_, max_height_, image_);
width_ = scaled_image_.width();
height_ = scaled_image_.height();
setFixedSize(width_, height_);
update(); update();
} }
@ -176,9 +158,15 @@ ImageItem::mousePressEvent(QMouseEvent *event)
void void
ImageItem::resizeEvent(QResizeEvent *event) ImageItem::resizeEvent(QResizeEvent *event)
{ {
Q_UNUSED(event); if (!image_)
return QWidget::resizeEvent(event);
scaleImage(); scaled_image_ = utils::scaleDown<QPixmap>(max_width_, max_height_, image_);
width_ = scaled_image_.width();
height_ = scaled_image_.height();
setFixedSize(width_, height_);
} }
void void