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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Помогите разобраться с QTransform  (Прочитано 7209 раз)
lighting
Гость
« : Март 02, 2013, 17:21 »

Всю задачу описывать не буду, т.к. длинно и к проблеме непосредственного отношения не имеет. Сформулирую кратко задачу так:
Имеется холст заданного размера, на нем размещено изображение, о котором нам известны его начальные координаты, а также его модификаторы (угол поворота и масштаб). По этим данным нужно создать QImage и правильно заполнить его. Казалось-бы задача решается просто (скорее всего так оно и есть):
- создать QImage нужного размера
- залить его фоновым цветом
- в еще один QImage загрузить изображение
- создать QTransform
- вызвать translate, rotate, scale для этого QTransform
- трансформированное изображение нарисовать используя drawImage на первом QImage
- сохранить первый QImage в файл
Однако на практике появляются проблемы, при повороте/масштабировании размеры второго QImage меняются и происходит смещение при выводе на drawImage которое видно в прикрепленном изображении. На первой и третьей картинке показан желаемый результат, на второй и четвертой - то что получается. Чувствую что задача эта решается как-то просто, но вторую неделю не могу найти это простое решение.
« Последнее редактирование: Март 05, 2013, 10:08 от lighting » Записан
ltise
Гость
« Ответ #1 : Март 02, 2013, 17:29 »

В QTransform есть прикольные методы:
QTransform::quadToQuad(const QPolygonF &one,
                           const QPolygonF &two,
                           QTransform &result);
QTransform::quadToSquare(const QPolygonF &one,
                           const QPolygonF &two,
                           QTransform &result);

Просто указываешь исходный полигон и требуемый полигон - результатом является требуемая матрица.
Очень удобно.
В полигонах должно быть строго 4 точки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 02, 2013, 17:42 »

Проще всего поворачивать и масштабировать картинку относительно ее центра, т.е. сначала translate(w/2, -h/2). Тогда центры новой и старой картинок будут соответствовать одной и той же исходной точке  Остается только вписать новый в старый размер
Код
C++ (Qt)
int dx = (newImg.width() - oldImg.width()) / 2;
int dy = (newImg.height() - oldImg.height()) / 2;
oldImg = newImg.copy(dx, dy, oldImg.width(), oldImg.height());
Записан
lighting
Гость
« Ответ #3 : Март 03, 2013, 10:21 »

Пока к сожалению нет возможности проверить, вечером доберусь до компа и попробую. Правда есть вопрос, не опечатка-ли зедсь:
сначала translate(w/2, -h/2).
Тут действительно надо -h/2? bили всетаки плюс?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 03, 2013, 11:08 »

Тут действительно надо -h/2? bили всетаки плюс?
Та может и плюс Улыбающийся Обычно я об этом не задумываюсь - посмотрел, ага, не туда крутит, ну значит поменял минус на плюс.

Ну и вообще - есть простые операции на плоскости, QTransform всего лишь их реализует. Поэтому лучше подучить геометрию, а не классы  Улыбающийся
Записан
lighting
Гость
« Ответ #5 : Март 05, 2013, 10:07 »

Igors спасибо, помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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