Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Vladimir от Апрель 27, 2015, 15:03



Название: [РЕШЕНО] Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 27, 2015, 15:03
Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.


Название: Re: Преобразовать QImage в трапецию
Отправлено: Igors от Апрель 27, 2015, 15:15
Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.
Матричное преобразование отображает равные отрезки в равные - но для трапеции (деформации) это не так. Поэтому QTransform здесь не поможет. Надо писать самому - ну или нагугливать "готовое решение"


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 27, 2015, 15:31
Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.
Матричное преобразование отображает равные отрезки в равные - но для трапеции (деформации) это не так. Поэтому QTransform здесь не поможет. Надо писать самому - ну или нагугливать "готовое решение"

Понятно! Может советом поможете или ссылкой куда копать?


Название: Re: Преобразовать QImage в трапецию
Отправлено: Igors от Апрель 27, 2015, 15:50
Понятно! Может советом поможете или ссылкой куда копать?
Погуглите, если ничего хорошего - завтра найду время, попробую сам написать


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 27, 2015, 16:04
Понятно! Может советом поможете или ссылкой куда копать?
Погуглите, если ничего хорошего - завтра найду время, попробую сам написать

Гуглю пока ничего определенного.. Спасибо!


Название: Re: Преобразовать QImage в трапецию
Отправлено: AlFoX от Апрель 28, 2015, 04:09
Я бы сделал через QGraphicsScene. там есть перспектива
Вот похожий пример, только в вашем случае вращать вокруг оси X
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=510&key=MovableQGraphicsPixmapItem


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 28, 2015, 10:18
Я бы сделал через QGraphicsScene. там есть перспектива
Вот похожий пример, только в вашем случае вращать вокруг оси X
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=510&key=MovableQGraphicsPixmapItem

Проект уже сделан и все рисование там осуществляется на QWidget в разных слоях картинках, поэтому не очень хочется ради видоизменения одной прикручивать сцену и переделывать все остальное рисование, коего немало.. но эффект интересный! Только вот когда вращаю вокруг X меняется только одна сторона трапеции (правая), а левая остается под прямым углом.. какая-то односторонняя перспектива получается. А необходимо равномерно видоизменить прямоугольник (квадрат) в равностороннюю трапецию!


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 28, 2015, 10:51
Хотя можно только поменять картинку при помощи сцены (http://stackoverflow.com/questions/23698114/how-can-i-apply-a-graphic-effect-to-the-image-in-qlistview), но опять же какая-то не совсем правильная перспектива получается. При чем необходимо не только сузить верх картинки равномерно, но и также равномерное растянуть низ трапеции. Можно ли этого добиться перспективой сцены?


Название: Re: Преобразовать QImage в трапецию
Отправлено: AlFoX от Апрель 28, 2015, 11:19
Это должно помочь:
QTransform & QTransform::translate(qreal dx, qreal dy)

выставьте центр трансформации на центр картинки


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 28, 2015, 11:28
Это должно помочь:
QTransform & QTransform::translate(qreal dx, qreal dy)

выставьте центр трансформации на центр картинки

translate() и выставляет центр трансофрмации? Это функция только сместила у меня картинку на dx и dy вправо вниз


Название: Re: Преобразовать QImage в трапецию
Отправлено: AlFoX от Апрель 28, 2015, 11:31
В коде из примера выше:
Код:
 QTransform transform;    
    transform.translate(20,20);
    transform.rotate(60,Qt::YAxis);
    pixmapItem->setTransform(transform);

    сначала translate, потом rotate


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 28, 2015, 11:46
В коде из примера выше:
Код:
 QTransform transform;    
    transform.translate(20,20);
    transform.rotate(60,Qt::YAxis);
    pixmapItem->setTransform(transform);

    сначала translate, потом rotate

так и делаю, но смещается левый верхний угол картинки, перспектива не меняется. прикреплю проект


Название: Re: Преобразовать QImage в трапецию
Отправлено: AlFoX от Апрель 28, 2015, 12:32
рабочий пример

Код:
#include "widget.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QGraphicsDropShadowEffect>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
        QApplication app(argc,argv);
        QGraphicsScene scene;

        QGraphicsPixmapItem* pixmapItem = new QGraphicsPixmapItem(*(new QPixmap(":/Number.jpg")));
        pixmapItem->setFlags(QGraphicsItem::ItemIsMovable);

        QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
        effect->setBlurRadius(20);
        effect->setOffset(20,20);

        pixmapItem->setGraphicsEffect(effect);

        qreal x = pixmapItem->boundingRect().width()/2;
        qreal y =pixmapItem->boundingRect().height()/2;

        QTransform transform;
        transform.translate(x,y).rotate(60,Qt::XAxis).translate(-x,y);
        pixmapItem->setTransform(transform);

        QGraphicsView view(&scene);

        scene.addItem(pixmapItem);

        view.showFullScreen();

        return app.exec();
}


Название: Re: Преобразовать QImage в трапецию
Отправлено: Vladimir от Апрель 28, 2015, 13:01
рабочий пример

Код:
#include "widget.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QGraphicsDropShadowEffect>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
        QApplication app(argc,argv);
        QGraphicsScene scene;

        QGraphicsPixmapItem* pixmapItem = new QGraphicsPixmapItem(*(new QPixmap(":/Number.jpg")));
        pixmapItem->setFlags(QGraphicsItem::ItemIsMovable);

        QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
        effect->setBlurRadius(20);
        effect->setOffset(20,20);

        pixmapItem->setGraphicsEffect(effect);

        qreal x = pixmapItem->boundingRect().width()/2;
        qreal y =pixmapItem->boundingRect().height()/2;

        QTransform transform;
        transform.translate(x,y).rotate(60,Qt::XAxis).translate(-x,y);
        pixmapItem->setTransform(transform);

        QGraphicsView view(&scene);

        scene.addItem(pixmapItem);

        view.showFullScreen();

        return app.exec();
}

Спасибо! Буду пробовать применять данную трапецию к моей задаче, там правда еще нужно расширить низ,но это видимо можно будет сделать sclale-м! Спасибо еще раз!