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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Программно нарисовать тень в QImage  (Прочитано 3821 раз)
alekseymenkov
Новичок

Offline Offline

Сообщений: 5


Просмотр профиля
« : Август 28, 2020, 01:41 »

Добрый день!
Подскажите, как можно программно нарисовать тень на картинках в отдельных потоках?
Есть 10к изображений, которые нужно обработать. Сейчас использую QThread + QGraphicsDropShadowEffect, но QGraphicsScene, которая нужна для отрисовки тени через QGraphicsDropShadowEffect - не thread-safety, поэтому иногда крашит приложение.
Может быть есть еще какие-нибудь варианты?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Август 28, 2020, 12:35 »

Ну тащить бандуру QGraphicsScenе только для простого эффекта - явно "не то". Почему просто не конвертировать имедж  в "двуцветный" (тень) и отрисовать его первым со смещением вправо и вниз ?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Сентябрь 02, 2020, 15:06 »

Добрый день!
Подскажите, как можно программно нарисовать тень на картинках в отдельных потоках?
Есть 10к изображений, которые нужно обработать. Сейчас использую QThread + QGraphicsDropShadowEffect, но QGraphicsScene, которая нужна для отрисовки тени через QGraphicsDropShadowEffect - не thread-safety, поэтому иногда крашит приложение.
Может быть есть еще какие-нибудь варианты?
Если не хочется изобретать велосипед, то идёшь в исходники, и берёшь от туда код, отвечающий за отбрасывание тени:

Код
C++ (Qt)
void QPixmapDropShadowFilter::draw(QPainter *p,
                                  const QPointF &pos,
                                  const QPixmap &px,
                                  const QRectF &src) const
{
   Q_D(const QPixmapDropShadowFilter);
 
   if (px.isNull())
       return;
 
   QImage tmp(px.size(), QImage::Format_ARGB32_Premultiplied);
   tmp.setDevicePixelRatio(px.devicePixelRatioF());
   tmp.fill(0);
   QPainter tmpPainter(&tmp);
   tmpPainter.setCompositionMode(QPainter::CompositionMode_Source);
   tmpPainter.drawPixmap(d->offset, px);
   tmpPainter.end();
 
   // blur the alpha channel
   QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied);
   blurred.setDevicePixelRatio(px.devicePixelRatioF());
   blurred.fill(0);
   QPainter blurPainter(&blurred);
   qt_blurImage(&blurPainter, tmp, d->radius, false, true);
   blurPainter.end();
 
   tmp = blurred;
 
   // blacken the image...
   tmpPainter.begin(&tmp);
   tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
   tmpPainter.fillRect(tmp.rect(), d->color);
   tmpPainter.end();
 
   // draw the blurred drop shadow...
   p->drawImage(pos, tmp);
 
   // Draw the actual pixmap...
   p->drawPixmap(pos, px, src);
}
 
Вместо QPixmap используешь QImage, ибо QPixmap умеет только в GUI потоке работать.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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