Добрый день!
Подскажите, как можно программно нарисовать тень на картинках в отдельных потоках?
Есть 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 потоке работать.