Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как добавить тень к изображению?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
RazrFalcon
Нужно просто открыть PNG - добавить тень - сохранить.
Никак не пойму что делать. Гугл говорить только про QGraphicsDropShadowEffect. Но я не понимаю как его прикрутить к QPixmap...
Спасибо.
BRE
Что ты подразумеваешь под "добавить тень"?
RazrFalcon
BRE
Тень с каждой стороны можно рассматривать как размытый прямоугольник.
RazrFalcon
Как размыть прямоугольник? <_<
BRE
Поищи в google на слово blur или посмотри в исходниках Qt как это сделано в QGraphicsDropShadowEffect.
RazrFalcon
Это и я сам могу, я думал кто-то делал что-то подобное.
ilyabvt
Типа такого имелось ввиду?
Это правда без всякой размытости и прочих фич.
RazrFalcon
Не. Размытие обязательно.
Sokoloff
Цитата(RazrFalcon @ 7.11.2011, 16:54) *
Не. Размытие обязательно.
А если уменьшить изображение, сделать его черно белым, потом увеличить со сглаживанием, и выводить с некоторой прозрачностью?
RazrFalcon
:blink:

Мне код нужен, а не техника. Я не пойму что писать. В принципе! ;)
ernie
код для размытия :

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;


Тут главная идея вот в чем :

Сначала отрисовываем копию нашего изображения в нужном цвете с помощью:
tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
и tmpPainter.fillRect(0, 0, img.width(), img.height(),QColor("#333333")); 333333 - цвет тени.

потом это изображение трансформируем,размываем - получается тень,поверх тени рисуем исходное изображение
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.