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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Смешивание 2-х изображенией по альфа-каналу  (Прочитано 3328 раз)
artiom_kh
Гость
« : Сентябрь 27, 2011, 11:44 »

Добрый день! Необходимо отрисовать по некой заданной маске картинку через QPainter, маска задана тоже неким пиксмапом:

если картинку невидно - то http://www49.zippyshare.com/v/82491987/file.html

на картинке слева - маска, посередине - изображение, справа - желаемый результат

Записан
slim
Гость
« Ответ #1 : Сентябрь 27, 2011, 12:00 »

попробуй setMask
Записан
artiom_kh
Гость
« Ответ #2 : Сентябрь 27, 2011, 12:04 »

попробуй setMask
спасибо, хотелось бы добиться результата путём выбора режима смешивания (QPainter::CompositionMode), без QPixmap::setMask и без обрезки по региону
Записан
artiom_kh
Гость
« Ответ #3 : Октябрь 11, 2011, 10:07 »

решение найдено - но не совсем то что хотелось бы:

Код
C++ (Qt)
void testMask::paintMasked( QPainter* p )
{
 if( p )
 {
   p->fillRect( rect(), Qt::transparent );
 
   p->setCompositionMode(QPainter::CompositionMode_Source);
 
   p->drawPixmap( QPointF(), m_mask );
 
   p->setCompositionMode(QPainter::CompositionMode_SourceIn);
 
   p->drawPixmap(0,0,m_image);
 }
}

если сначала отрисовать всё в QPixmap а затем вывести на виджет в paintEvent то всё ок:
Код
C++ (Qt)
void testMask::paintEvent( QPaintEvent* pE )//v1
{
 QDialog::paintEvent( pE );
 
//   QPainter p( this );
//   paintMasked( &p );
 
 QPixmap px( size() );
 px.fill( Qt::transparent );
 
 QPainter p( &px );
 
 paintMasked( &p );
 p.end();
 
 p.begin( this );
 p.drawPixmap( QPoint(), px );
 p.end();
}

[скриншот - http://www35.zippyshare.com/v/78683668/file.html]
а вот когда рисуешь непосредственно на виджете, то получаем чёрную область на месте предполагаемой прозрачности:
Код
C++ (Qt)
void testMask::paintEvent( QPaintEvent* pE )//v2
{
 QDialog::paintEvent( pE );
 
 QPainter p( this );
 //p.setBackground( Qt::transparent );
 paintMasked( &p );
 
//   QPixmap px( size() );
//   px.fill( Qt::transparent );
//
//   QPainter p( &px );
//  
//   paintMasked( &p );
//   p.end();
//  
//   p.begin( this );
//   p.drawPixmap( QPoint(), px );
//   p.end();
}
[скриншот - http://www35.zippyshare.com/v/32651042/file.html]
аналогичную чёрную область можно получить и при отрисовке в темповый pixmap (v1), если выставить виджету аттрибут:
Код
C++ (Qt)
setAttribute( Qt::WA_NoSystemBackground );

похожая проблема описана вот здесь: http://www.qtcentre.org/threads/43614-transparency-problem.-pls-help.
там челу посоветовали юзать темповый pixmap, данный вариант не подходит мне по производительности и использованию памяти, может есть какая-то возможность настроить QPainter так что-бы при отрисовке на виджете результат был аналогичен тому что и при отрисовке в QPixmap (хотя по логике вещей он и должен быть таковым)?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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