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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: изменение размера QPixmap  (Прочитано 5941 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Июль 26, 2018, 14:20 »

В QGraphicScene рисую наследника QGraphicsItem, который отрисовывает QPixmap. Рисую как правило линии и текст.
Проблема в том что при масштабировании вниз результат напоминает не сглаживание, а выкинутые пиксели - выглядит плохо.

Данный код рисует корректно, но мне QGraphicsPixmapItem не подходит:
Код:
QGraphicsPixmapItem *pixItem = scene->addPixmap( QPixmap() );
pixItem->setTransformationMode(Qt::TransformationMode::SmoothTransformation);

Данный код немного размазывает границы при увеличении масштаба, но при уменьшении все выглядит так же плохо.
Код:
   
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);

Теперь проблема:
Внутри QGraphicsItem::paint
Код:
// 1 способ
    painter->drawPixmap( boundingRect(), m_pix, m_pix.rect() );

// 2 способ
    QSize size = boundingRect().size().toSize();
    painter->drawPixmap( boundingRect().topLeft(), m_pix.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
второй способ рисует корректно, но иногда размер изображения больше чем размер элемента в сцене - и тогда при масштабе 200% мы получаем размытую картинку(что логично).
первый способ увеличивает правильно, но размывает плохо - эффект пропущеных пикселей.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #1 : Июль 26, 2018, 14:45 »

Примерно так (см. вложения)

Хочу нарисовать первым способом с таким же размытием как во втором способе.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Июль 26, 2018, 16:30 »

Конечно можно попробовать взять painter->worldTransform().toAffine().m11 и m22, они содержат масштаб с которым происходит отрисовка.

qreal scale = painter->worldTransform().toAffine().m11();
QSize size = boundingRect().size().toSize();
painter->drawPixmap( boundingRect().topLeft(), m_pix.scaled(size*scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Июль 27, 2018, 10:33 »

Эти 2 способа рисуют корректно:
QPixmap::scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation))
QGraphicsPixmapItem::setTransformationMode(Qt::TransformationMode::SmoothTransformation);

Сделал первым способом, можно ли drawPixmap заставить масштабировать корректно? Или может есть еще сспособы?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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