Qt QLabel:缩放图像以缩放和降低图像质量
嘿,所以我有这个功能,它可以很好地工作和缩放图像,并在用户界面提供正确快捷方式的情况下缩小和扩展图像 但是,当我缩放回图像的原始比例因子时,我会丢失图像质量。我试过制作“orig”,它是一个全局的“const QPixmap*”当图像加载到UI中时,定义“源”。然后我在下面的代码中设置'pixmap=orig',但这似乎不起作用,我不知道为什么Qt QLabel:缩放图像以缩放和降低图像质量,qt,zooming,scaling,pixmap,Qt,Zooming,Scaling,Pixmap,嘿,所以我有这个功能,它可以很好地工作和缩放图像,并在用户界面提供正确快捷方式的情况下缩小和扩展图像 但是,当我缩放回图像的原始比例因子时,我会丢失图像质量。我试过制作“orig”,它是一个全局的“const QPixmap*”当图像加载到UI中时,定义“源”。然后我在下面的代码中设置'pixmap=orig',但这似乎不起作用,我不知道为什么 其思想是在不重写原始的pixmap的情况下复制它,以保持像素质量,然后在调用函数时重新加载原始的pixmap void FragTreeViewer::
其思想是在不重写原始的pixmap的情况下复制它,以保持像素质量,然后在调用函数时重新加载原始的pixmap
void FragTreeViewer::scaleImage(double factor)
{
Q_ASSERT(imageLabel->pixmap());
const QPixmap* pixmap = orig;
scaleFactor *= factor;
int w = (imageLabel->width())*scaleFactor;
int h = (imageLabel->height())*scaleFactor;
imageLabel->setPixmap(pixmap->scaled(w, h, Qt::KeepAspectRatio));
adjustScrollBar(scrollArea->horizontalScrollBar(), scaleFactor);
adjustScrollBar(scrollArea->verticalScrollBar(), scaleFactor);
//zoomInAct->setEnabled(scaleFactor < 3.0);
//zoomOutAct->setEnabled(scaleFactor > 0.333);
}
您没有显示相关的代码,您所显示的内容很好。据我所知,您正在尝试调整标签中显示的pixmap和标签本身的大小。你应该做一个或另一个,而不是两个都做。最简单的方法是调整标签的大小,并让滚动区域发挥其魔力。这使整个事件变得微不足道 下面的代码是您应该在问题中发布的,需要修改才能修复
我们的想法是复制它,const QPixmap*pixmap=orig;-这不是一个副本。@cmannett85缩放调用生成副本,pixmap局部变量是多余的。
// https://github.com/KubaO/stackoverflown/tree/master/questions/image-view-scale-31619246
#include <QtWidgets>
#include <QtNetwork>
class FragTreeViewer : public QWidget {
QGridLayout m_layout{this};
QScrollArea m_area;
QLabel m_imageLabel, m_scaleLabel;
QPushButton m_zoomOut{"Zoom Out"}, m_zoomIn{"Zoom In"};
double m_scaleFactor = 1.0;
public:
void setImage(const QImage & img) {
m_scaleFactor = 1.0;
m_imageLabel.setPixmap(QPixmap::fromImage(img));
scaleImage(1.0);
}
FragTreeViewer() {
m_layout.addWidget(&m_area, 0, 0, 1, 3);
m_layout.addWidget(&m_zoomOut, 1, 0);
m_layout.addWidget(&m_scaleLabel, 1, 1);
m_layout.addWidget(&m_zoomIn, 1, 2);
m_area.setWidget(&m_imageLabel);
m_imageLabel.setScaledContents(true);
connect(&m_zoomIn, &QPushButton::clicked, [this]{ scaleImage(1.1); });
connect(&m_zoomOut, &QPushButton::clicked, [this]{ scaleImage(1.0/1.1); });
}
void scaleImage(double factor) {
m_scaleFactor *= factor;
m_scaleLabel.setText(QStringLiteral("%1%").arg(m_scaleFactor*100, 0, 'f', 1));
QSize size = m_imageLabel.pixmap()->size() * m_scaleFactor;
m_imageLabel.resize(size);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FragTreeViewer viewer;
QNetworkAccessManager mgr;
QScopedPointer<QNetworkReply> rsp(
mgr.get(QNetworkRequest({"http://i.imgur.com/ikwUmUV.jpg"})));
QObject::connect(rsp.data(), &QNetworkReply::finished, [&]{
if (rsp->error() == QNetworkReply::NoError)
viewer.setImage(QImage::fromData(rsp->readAll()));
});
viewer.show();
return a.exec();
}