Нужно просто открыть PNG - добавить тень - сохранить.
Никак не пойму что делать. Гугл говорить только про QGraphicsDropShadowEffect. Но я не понимаю как его прикрутить к QPixmap...
Спасибо.
QImage blur(const QImage& image, const QRect& rect, int radius)
{
int tab[] = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 };
int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius-1];
QImage result = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
int r1 = rect.top();
int r2 = rect.bottom();
int c1 = rect.left();
int c2 = rect.right();
int bpl = result.bytesPerLine();
int rgba[4];
unsigned char* p;
for (int col = c1; col <= c2; col++) {
p = result.scanLine(r1) + col * 4;
for (int i = 0; i < 4; i++)
rgba[i] = p[i] << 4;
p += bpl;
for (int j = r1; j < r2; j++, p += bpl)
for (int i = 0; i < 4; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int row = r1; row <= r2; row++) {
p = result.scanLine(row) + c1 * 4;
for (int i = 0; i < 4; i++)
rgba[i] = p[i] << 4;
p += 4;
for (int j = c1; j < c2; j++, p += 4)
for (int i = 0; i < 4; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int col = c1; col <= c2; col++) {
p = result.scanLine(r2) + col * 4;
for (int i = 0; i < 4; i++)
rgba[i] = p[i] << 4;
p -= bpl;
for (int j = r1; j < r2; j++, p -= bpl)
for (int i = 0; i < 4; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int row = r1; row <= r2; row++) {
p = result.scanLine(row) + c2 * 4;
for (int i = 0; i < 4; i++)
rgba[i] = p[i] << 4;
p -= 4;
for (int j = c1; j < c2; j++, p -= 4)
for (int i = 0; i < 4; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
return result;
}
QImage addImageShadow(const QPointF &pos,const QImage &px,const QRectF &src,
float shadowRadius,float shadowBlurRadius){
float SHADOW_RADIUS = shadowRadius;
float BLUR_RADIUS = shadowBlurRadius;
QImage tmp = px;
tmp = tmp.scaled(tmp.width()*SHADOW_RADIUS,tmp.height()*SHADOW_RADIUS);
QImage img(tmp.size(),QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::transparent);
QPainter tmpPainter(&img);
tmpPainter.drawImage(QPoint(0,0),tmp,tmp.rect());
tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
tmpPainter.setRenderHint(QPainter::HighQualityAntialiasing);
tmpPainter.fillRect(0, 0, img.width(), img.height(),QColor("#333333"));
tmpPainter.end();
QImage finalImage(tmp.size(),QImage::Format_ARGB32_Premultiplied);
finalImage.fill(Qt::transparent);
QPainter finalPainter(&finalImage);
finalPainter.drawImage(QPoint(0,0),blur(img,img.rect(),BLUR_RADIUS),finalImage.rect());
// Draw the actual pixmap...
finalPainter.drawImage(QPoint(px.width()*((SHADOW_RADIUS-1)/2),px.height()*((SHADOW_RADIUS-1)/2)), px, src);
finalPainter.end();
return finalImage;