Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
#1

Как повернуть изображение - C++ Qt

27.03.2014, 20:53. Просмотров 2490. Ответов 16
Метки нет (Все метки)

Имеется объект типа QImage, мне требуется его повернуть.
Вот код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QImage>
#include <QBrush>
#include <QTimer>
#include "road.h"
 
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    x=0;y=0;
     x0=150;
     y0=0;
    QTimer *timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    timer->start(1);
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
 
void MainWindow::paintEvent(QPaintEvent *){
    QPainter painter(this);
    QBrush b; 
    
    b.setTextureImage(image);
    painter.setBrush(b);
    painter.drawRect(contentsRect());
    coop a[4];
    for(int i=0; i<4; i++){
    a[i]=roadtorome.draw(painter,i);}
    //qDebug("%d,%d,%d,%d",x,y,x0,y0);
    if(x0==a[0].x && y0==a[0].y)
    {
      //Поворачивает с севера на восток
    }
    if(x0==a[1].x && y0==a[1].y)
    {
      //Поворачивает с запада на север
    }
    if(x0==a[2].x && y0==a[2].y)
    {
      //Поворачивает с юга на запад
    }
    if(x0==a[3].x && y0==a[3].y)
    {
      //Поворачивает с востока на север
    }
    painter.drawImage(x0+roadNS.width()/2-tank.width()/2,y0,tank);
 
}
void MainWindow:: update(){
    y0++;
   repaint();
}
В MainWindow рисуется дорога, и танчик, которые двигается при помощи изменения его y-координаты в update. Дам пояснения, если надо. Заранее благодарен
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 20:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как повернуть изображение (C++ Qt):

Повернуть картинку на label'e
Помогите повернуть картинку которая находится на лейбле QPixmap...

[Решено] Повернуть заголовки вкладок QTabWidget
Добрый вечер!:) У меня есть вкладки класса QTabWidget, вкладки расположены...

QDomElement. Как c вставить изображение в структуру DOM ?
Если никак, то есть ли другие средства?

QDomElement. Как c ним вставить изображение в структуру DOM ?
Если никак, то есть ли другие средства?

Как правильно принять изображение JPG и записать в файл TCP
Я с TCP клиента андроид передаю на сервер файл JPEG.Данные вроде отправляются...

Как добавить изображение, которое будет отрисовываться при добавлении объекта класса
Как добавить изображение, которое будет отрисовываться при добавлении объекта...

16
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
27.03.2014, 22:12 #2
Первая ссылка гугла, этот же форум.
Вращение изображения
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 22:14  [ТС] #3
axefizik, Да, я видел, но я когда использую rotate() он только на один "кадр" меняет направление, а дальше идёт как шёл ? как сохранить его поворот ? .save() использую, но ничего.
0
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
27.03.2014, 22:20 #4
Вы делали по предложенному "полностью рабочему варианту"?
Если да, то попробуйте вынести первый Pixmap(тот который shipPixels) в хидер, а то он каждый раз создаётся заново.
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 22:34  [ТС] #5
axefizik, Дело в том, что мне код не очень понятен, знаком с QT третий день. не могли бы вкратце код объяснить, с азами, я знаком.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void MainWindow::on_pushButton_2_pressed()
{
    QPixmap shipPixels(":/new/prefix1/img.bmp");
    QPixmap rotatePixmap(shipPixels.size());
    rotatePixmap.fill(Qt::transparent);
 
    QPainter p(&rotatePixmap);
    p.setRenderHint(QPainter::Antialiasing); // сглаживание
    p.setRenderHint(QPainter::SmoothPixmapTransform); 
    p.setRenderHint(QPainter::HighQualityAntialiasing);
    p.translate(rotatePixmap.size().width() / 2, rotatePixmap.size().height() / 2);
    p.rotate(30); // градус
    p.translate(-rotatePixmap.size().width() / 2, -rotatePixmap.size().height() / 2);
    p.drawPixmap(0, 0, shipPixels);
    p.end();
    shipPixels = rotatePixmap;
    
    ui->label->setPixmap(shipPixels);
}
0
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
27.03.2014, 23:00 #6
В mainwindow.h пишем:
C++ (Qt)
1
QPixmap *shipPixels;
Я понятия не имею почему тут нужен указатель, но иначе оно отказывалось работать.
Дальше в конструкторе:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    shipPixels = new QPixmap("Icon.png");//Ставим картинку
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onPressed()));
}
 
void MainWindow::onPressed(){
        QPixmap rotatePixmap(*shipPixels);//создаём промежуточный Pixmap
        rotatePixmap.fill(Qt::transparent);//Заполняем его прозрачным
 
        QPainter p(&rotatePixmap);//Создаем Painter
        p.setRenderHint(QPainter::Antialiasing); // сглаживание
        p.setRenderHint(QPainter::SmoothPixmapTransform); //смягчение, советую убрать, а то картинка расплывается
        p.setRenderHint(QPainter::HighQualityAntialiasing);// ещё сглаживание
        p.translate(rotatePixmap.size().width() / 2, rotatePixmap.size().height() / 2); //перенос начала системы координат в центр картинки
        p.rotate(30); // градус, вращение системы координат её относительно начала
        p.translate(-rotatePixmap.size().width() / 2, -rotatePixmap.size().height() / 2);//систему координат обратно в левый верхний угол для нормальной отрисовки
        p.drawPixmap(0, 0, *shipPixels);//рисуем изображение в новой системе координат
        p.end();//просто нужен
        *shipPixels = rotatePixmap;//запоминаем текущее состояние
 
        ui->label->setPixmap(*shipPixels);//выводим картинку
}
На самом деле тут еще надо повозиться с размерами, а то даже у квадратной картинки срезаются углы, а что будет с прямоугольниками...
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 23:07  [ТС] #7
axefizik, это же можно организовать как функцию ? И, что такое shipPixels ? то есть он даже квадратную картинку может испортить ? а, допустим, если дан прямоульный рисунок, то, получается, этот метод не работает.
0
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
27.03.2014, 23:43 #8
Лучший ответ Сообщение было отмечено handkock как решение

Решение

Хм, это уже организовано как функция.
shipPixsels - это просто название объекта хранящего картинку
Если вращать на углы кратные 90, то нет; для других вариантов - мы работаем над этим

Добавлено через 21 минуту
Итак, опытным путем было установлено:
В mainwindow.h:
C++ (Qt)
1
float diag;
В конструктор:
C++ (Qt)
1
2
3
4
shipPixels = new QPixmap("Icon.png");
    ui->label->setPixmap(*shipPixels);//Первая отрисовка
    diag = qSqrt(shipPixels->size().height()*shipPixels->size().height() +
                      shipPixels->size().width()*shipPixels->size().width());//максимальный размер по теореме Пифагора
И изменяем функцию:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        QPixmap rotatePixmap(QSize(diag, diag));//делаем размер с запасом
        rotatePixmap.fill(Qt::transparent);
 
        QPainter p(&rotatePixmap);
        p.setRenderHint(QPainter::Antialiasing); // сглаживание
        p.setRenderHint(QPainter::SmoothPixmapTransform);
        p.setRenderHint(QPainter::HighQualityAntialiasing);
        p.translate(diag / 2, diag / 2); //сдвиг
        p.rotate(30); // градус
        p.translate(-shipPixels->size().width() / 2, -shipPixels->height() / 2);//надо так, а то вращается не вокруг центра
        p.drawPixmap(0, 0, *shipPixels);
        p.end();
        *shipPixels = rotatePixmap;
 
        ui->label->setPixmap(*shipPixels);
1
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 23:55  [ТС] #9
axefizik, а как при помощи translate() можно поменять x и y ?

Добавлено через 1 минуту
Цитата Сообщение от axefizik Посмотреть сообщение
QPixmap rotatePixmap(QSize(diag, diag));//делаем размер с запасом
- что даётся в качестве аргумента ?
0
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
28.03.2014, 00:00 #10
Первого вопроса я не понял вообще?
В качестве аргумента даётся объект QSize с размерами равными diag.
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
28.03.2014, 00:06  [ТС] #11
axefizik, смотрите, можно ли перевернуть систему координат, я читал, что можно, но конкретного ничего не нашёл

Добавлено через 2 минуты
ПОдключать что-то надо, а то он не видит shipPixels, qSqrt, ругается на ui->label->setPixmap(*shipPixels), что у него нет поля label
0
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
28.03.2014, 00:12 #12
Я всё равно ничего не понял, но по-моему оно достигается поворотом на 90-180-270 градусов.

Добавлено через 4 минуты
C++ (Qt)
1
2
#include <QPixmap>
#include <QtCore/qmath.h>
Просто добавьте лейбл на форму
1
alexey_rage
589 / 389 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
28.03.2014, 09:32 #13
Цитата Сообщение от handkock Посмотреть сообщение
Имеется объект типа QImage, мне требуется его повернуть
C++ (Qt)
1
2
3
4
QImage img("<грузим картинку>")
QTransform transform;
transform.rotate(angle); // где angle - угол поворота в градусах
img = img.transformed(transform);
2
axefizik
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
Завершенные тесты: 1
28.03.2014, 09:40 #14
Это, конечно, красиво, только вот картинка вертится и уезжает, как колесо.
0
alexey_rage
589 / 389 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
28.03.2014, 10:04 #15
Цитата Сообщение от axefizik Посмотреть сообщение
Это, конечно, красиво, только вот картинка вертится и уезжает, как колесо.
Потому, что вертится относительно левого верхнего угла, а не относительно центра.
Соответственно нужно делать поправку по координатам.

P.S. Я бы для таких целей использовал QGraphicsItem. В нем все методы реализованы. ИМХО
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
28.03.2014, 22:13  [ТС] #16
alexey_rage, Спасибо, это то, что надо
0
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
01.04.2014, 22:38  [ТС] #17
axefizik, Я всё-таки не воспользовался вашим методом. Смотрите, что использую
C++ (Qt)
1
2
3
4
5
6
QMatrix angle;
    angle.rotate(30);
    angle.translate(tank.width()/2,tank.height()/2);
    tank=tank.transformed(angle);
    angle.translate(-tank.width()/2,-tank.height()/2);
    painter.drawImage(100,100,tank);
Что:
C++ (Qt)
1
2
3
4
5
6
QTransform trans;
        trans.rotate(30);
        trans.translate(tank.width()/2,tank.height()/2);
        tank=tank.transformed(trans);
        trans.translate(-tank.width()/2,-tank.height()/2);
        painter.drawImage(100,100,tank);
Всё равно получается нечёткое изображение, несмотря на то даже. что изображение квадратное. А что если мне понадобится вращать прямоугольное ? Помогите.
0
01.04.2014, 22:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2014, 22:38
Привет! Вот еще темы с решениями:

Как повернуть изображение?
Замучился искать. Много есть вариантов но они нерабочие, а те, что работают...

Как повернуть изображение?
Здравствуйте! Я загружаю Gif изображение в Bitmap и мне нужно чтобы оно...

Как повернуть изображение?
Вотъ код, но он чего-то не работает , ошибок нет, просто не выполняет поворот...

Как повернуть изображение на форме?
Image img=Resources.Image1;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru