Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: alekseymenkov от Август 28, 2020, 01:41



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


Название: Re: Программно нарисовать тень в QImage
Отправлено: Igors от Август 28, 2020, 12:35
Ну тащить бандуру QGraphicsScenе только для простого эффекта - явно "не то". Почему просто не конвертировать имедж  в "двуцветный" (тень) и отрисовать его первым со смещением вправо и вниз ?


Название: Re: Программно нарисовать тень в QImage
Отправлено: Kurles от Сентябрь 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 потоке работать.