gpt4 book ai didi

c++ - 放大/缩小图像 - QT c++

转载 作者:行者123 更新时间:2023-12-02 10:36:04 25 4
gpt4 key购买 nike

我目前正在使用 QT 将图像加载到 graphicsview 场景中。本质上,我正在寻找一种能够使用 slider 放大和缩小加载图像的方法。图像成功加载到 Pane 中,但无论我尝试实现放大/缩小,图像都会消失。

这是它的外观:

GraphicsView

这是我实现的功能,但图像消失了:

    void MainWindow::on_horizontalSlider_valueChanged(int value)
{
float pool ;
if(value==0 )
pool=0.1;
else
pool = value*0.01;

scene->update();
ui->graphicsView->transform();
ui->graphicsView->scale(pool,pool);

}

这就是我加载图像的方式:
    void MainWindow::on_BrowseImages_clicked()
{
QString imagePath = QFileDialog::getOpenFileName(
this,
tr("Open File"),
"",
tr("Images (*.jpg *.jpeg *.png)" )
);

imageObject = new QImage();
imageObject->load(imagePath);

image = QPixmap::fromImage(*imageObject);

scene = new QGraphicsScene(this);
scene->addPixmap(image);
scene->setSceneRect(image.rect());
ui->graphicsView->setScene(scene);
//ui->graphicsView->fitInView(scene->sceneRect(),Qt::KeepAspectRatio);

}

最佳答案

当缩放应用于变换时,它总是围绕原点缩放。

以某个中心(即不是原点)进行缩放意味着在缩放之前该中心已经平移到原点。

这可能是

v' = translateO→C(scale(translateC→O(v)))

或使用矩阵运算

v' = MtranslateO→C • Mscale • MtranslateC→O • v

但是,Grahics View Framework提供了一些默认情况下实际上内置组合转换的东西:

  • 每个项目都提供自己的本地转换。
  • 组项目的变换应用于子项目以及形成可以想象为局部坐标系的东西。

  • 考虑到这一点,我想出了以下 MCVE
    - 到中心的翻译应用于像素图项目
    - 缩放应用于成为像素图项的父项的组项。
    testQGraphicsViewScaleItem.cc :

    // Qt header:
    #include <QtWidgets>

    // main application
    int main(int argc, char **argv)
    {
    qDebug() << "Qt Version:" << QT_VERSION_STR;
    QApplication app(argc, argv);
    // setup data
    QGraphicsScene qGScene;
    QGraphicsItemGroup qGItemGrp;
    QImage qImgCat("cat.jpg");
    QGraphicsPixmapItem qGItemImg(QPixmap::fromImage(qImgCat));
    qGItemImg.setTransform(
    QTransform().translate(-0.5 * qImgCat.width(), -0.5 * qImgCat.height()));
    qGItemGrp.addToGroup(&qGItemImg);
    qGScene.addItem(&qGItemGrp);
    // setup GUI
    QWidget qWinMain;
    qWinMain.setWindowTitle("QGraphicsView - Scale Image");
    QVBoxLayout qVBox;
    QGraphicsView qGView;
    qGView.setScene(&qGScene);
    qVBox.addWidget(&qGView, 1);
    QSlider qSlider(Qt::Horizontal);
    qSlider.setRange(-100, 100);
    qVBox.addWidget(&qSlider);
    qWinMain.setLayout(&qVBox);
    qWinMain.show();
    // install signal handlers
    auto scaleImg = [&](int value) {
    const double exp = value * 0.01;
    const double scl = pow(10.0, exp);
    qGItemGrp.setTransform(QTransform().scale(scl, scl));
    };
    QObject::connect(&qSlider, &QSlider::valueChanged,
    scaleImg);
    // runtime loop
    return app.exec();
    }

    和一个 qmake 项目文件 testQGraphicsViewScaleItem.pro :

    SOURCES = testQGraphicsViewScaleItem.cc

    QT += widgets

    输出:

    Snapshot of testQGraphicsViewScaleItem (initial scaling)

    Snapshot of testQGraphicsViewScaleItem (0.1 < scaling < 1)

    Snapshot of testQGraphicsViewScaleItem (scaling = 0.1)

    Snapshot of testQGraphicsViewScaleItem (scaling = 10)

    关于c++ - 放大/缩小图像 - QT c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60240192/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com