Russian Qt Forum
Ноябрь 01, 2024, 06:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Преобразовать QImage в трапецию  (Прочитано 8908 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Апрель 27, 2015, 15:03 »

Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.
« Последнее редактирование: Май 05, 2015, 11:42 от Vladimir » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 27, 2015, 15:15 »

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

Сообщений: 305



Просмотр профиля
« Ответ #2 : Апрель 27, 2015, 15:31 »

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

Понятно! Может советом поможете или ссылкой куда копать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 27, 2015, 15:50 »

Понятно! Может советом поможете или ссылкой куда копать?
Погуглите, если ничего хорошего - завтра найду время, попробую сам написать
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #4 : Апрель 27, 2015, 16:04 »

Понятно! Может советом поможете или ссылкой куда копать?
Погуглите, если ничего хорошего - завтра найду время, попробую сам написать

Гуглю пока ничего определенного.. Спасибо!
Записан
AlFoX
Гость
« Ответ #5 : Апрель 28, 2015, 04:09 »

Я бы сделал через QGraphicsScene. там есть перспектива
Вот похожий пример, только в вашем случае вращать вокруг оси X
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=510&key=MovableQGraphicsPixmapItem
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #6 : Апрель 28, 2015, 10:18 »

Я бы сделал через QGraphicsScene. там есть перспектива
Вот похожий пример, только в вашем случае вращать вокруг оси X
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=510&key=MovableQGraphicsPixmapItem

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

Сообщений: 305



Просмотр профиля
« Ответ #7 : Апрель 28, 2015, 10:51 »

Хотя можно только поменять картинку при помощи сцены (http://stackoverflow.com/questions/23698114/how-can-i-apply-a-graphic-effect-to-the-image-in-qlistview), но опять же какая-то не совсем правильная перспектива получается. При чем необходимо не только сузить верх картинки равномерно, но и также равномерное растянуть низ трапеции. Можно ли этого добиться перспективой сцены?
Записан
AlFoX
Гость
« Ответ #8 : Апрель 28, 2015, 11:19 »

Это должно помочь:
QTransform & QTransform::translate(qreal dx, qreal dy)

выставьте центр трансформации на центр картинки
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #9 : Апрель 28, 2015, 11:28 »

Это должно помочь:
QTransform & QTransform::translate(qreal dx, qreal dy)

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

translate() и выставляет центр трансофрмации? Это функция только сместила у меня картинку на dx и dy вправо вниз
Записан
AlFoX
Гость
« Ответ #10 : Апрель 28, 2015, 11:31 »

В коде из примера выше:
Код:
 QTransform transform;    
    transform.translate(20,20);
    transform.rotate(60,Qt::YAxis);
    pixmapItem->setTransform(transform);

    сначала translate, потом rotate
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #11 : Апрель 28, 2015, 11:46 »

В коде из примера выше:
Код:
 QTransform transform;    
    transform.translate(20,20);
    transform.rotate(60,Qt::YAxis);
    pixmapItem->setTransform(transform);

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

так и делаю, но смещается левый верхний угол картинки, перспектива не меняется. прикреплю проект
Записан
AlFoX
Гость
« Ответ #12 : Апрель 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();
}
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #13 : Апрель 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-м! Спасибо еще раз!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.