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

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

27.03.2014, 20:53. Просмотров 5167. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2014, 20:53
Ответы с готовыми решениями:

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

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

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

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

16
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
27.03.2014, 22:12 2
Первая ссылка гугла, этот же форум.
Вращение изображения
0
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 22:14  [ТС] 3
axefizik, Да, я видел, но я когда использую rotate() он только на один "кадр" меняет направление, а дальше идёт как шёл ? как сохранить его поворот ? .save() использую, но ничего.
0
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
27.03.2014, 22:20 4
Вы делали по предложенному "полностью рабочему варианту"?
Если да, то попробуйте вынести первый Pixmap(тот который shipPixels) в хидер, а то он каждый раз создаётся заново.
0
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
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
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
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
27.03.2014, 23:07  [ТС] 7
axefizik, это же можно организовать как функцию ? И, что такое shipPixels ? то есть он даже квадратную картинку может испортить ? а, допустим, если дан прямоульный рисунок, то, получается, этот метод не работает.
0
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
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
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
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
28.03.2014, 00:00 10
Первого вопроса я не понял вообще?
В качестве аргумента даётся объект QSize с размерами равными diag.
0
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
28.03.2014, 00:06  [ТС] 11
axefizik, смотрите, можно ли перевернуть систему координат, я читал, что можно, но конкретного ничего не нашёл

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

Добавлено через 4 минуты
C++ (Qt)
1
2
#include <QPixmap>
#include <QtCore/qmath.h>
Просто добавьте лейбл на форму
1
594 / 394 / 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
11 / 11 / 3
Регистрация: 18.07.2012
Сообщений: 88
28.03.2014, 09:40 14
Это, конечно, красиво, только вот картинка вертится и уезжает, как колесо.
0
594 / 394 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
28.03.2014, 10:04 15
Цитата Сообщение от axefizik Посмотреть сообщение
Это, конечно, красиво, только вот картинка вертится и уезжает, как колесо.
Потому, что вертится относительно левого верхнего угла, а не относительно центра.
Соответственно нужно делать поправку по координатам.

P.S. Я бы для таких целей использовал QGraphicsItem. В нем все методы реализованы. ИМХО
0
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
28.03.2014, 22:13  [ТС] 16
alexey_rage, Спасибо, это то, что надо
0
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2014, 22:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как можно повернуть изображение на 'n' градусов?
Как можно повернуть изображение на 'n' градусов?

Как повернуть текст и изображение на image?
Подскажите, пожалуйста! Как выводить текст повернутый (на image)на угол, который я указал в поле...

Как программно повернуть изображение на экране на 90 градусов?
Как программно в Win7 сменить ориентацию экрана т.е. повернуть изображение на экране на 90...

Как повернуть изображение на 90 градусов в формате PostScript?
Доброго времени суток! Скачала вот по этой ссылке документ, но его изображение оказалось...


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

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

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