QT4如何模糊QPixmap图像?

QT4如何模糊QPixmap图像?,qt,graphics,qt4,effects,Qt,Graphics,Qt4,Effects,QT4如何模糊QPixmap图像 我正在寻找以下内容之一: Blur(pixmap); painter.Blur(); painter.Blur(rect); 最好的方法是什么?A是一种创建模糊效果的简单方法 编辑:瞧,我碰到了Qt。Qt 4.6中引入了它,它似乎可以完全满足您的需求。请查看以下内容: #include <QtGui/QApplication> #include <QImage> #include <QPixmap> #include &

QT4如何模糊QPixmap图像

我正在寻找以下内容之一:

Blur(pixmap); 
painter.Blur(); 
painter.Blur(rect);
最好的方法是什么?

A是一种创建模糊效果的简单方法

编辑:瞧,我碰到了Qt。Qt 4.6中引入了它,它似乎可以完全满足您的需求。

请查看以下内容:

#include <QtGui/QApplication>
#include <QImage>
#include <QPixmap>
#include <QLabel>

QImage blurred(const QImage& image, const QRect& rect, int radius, bool alphaOnly = false)
{
    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;

    int i1 = 0;
    int i2 = 3;

    if (alphaOnly)
        i1 = i2 = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3);

    for (int col = c1; col <= c2; col++) {
        p = result.scanLine(r1) + col * 4;
        for (int i = i1; i <= i2; i++)
            rgba[i] = p[i] << 4;

        p += bpl;
        for (int j = r1; j < r2; j++, p += bpl)
            for (int i = i1; i <= i2; 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 = i1; i <= i2; i++)
            rgba[i] = p[i] << 4;

        p += 4;
        for (int j = c1; j < c2; j++, p += 4)
            for (int i = i1; i <= i2; 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 = i1; i <= i2; i++)
            rgba[i] = p[i] << 4;

        p -= bpl;
        for (int j = r1; j < r2; j++, p -= bpl)
            for (int i = i1; i <= i2; 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 = i1; i <= i2; i++)
            rgba[i] = p[i] << 4;

        p -= 4;
        for (int j = c1; j < c2; j++, p -= 4)
            for (int i = i1; i <= i2; i++)
                p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
    }

    return result;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel label;
    QImage image("image.png");
    image =  blurred(image,image.rect(),10,false);
    label.setPixmap(QPixmap::fromImage(image));
    label.show();

    return a.exec();
}
#包括
#包括
#包括
#包括
图像模糊(常数图像和图像、常数矩形和矩形、整数半径、布尔字母=假)
{
int tab[]={14,10,8,6,5,5,4,3,3,3,2,2,2,2};
int alpha=(半径<1)?16:(半径>17)?1:tab[radius-1];
QImage结果=image.convertToFormat(QImage::Format_ARGB32_预乘);
int r1=rect.top();
int r2=rect.bottom();
int c1=矩形左();
int c2=矩形右();
int bpl=result.bytesPerLine();
int-rgba[4];
无符号字符*p;
int i1=0;
int i2=3;
如果(仅字母)
i1=i2=(QSysInfo::ByteOrder==QSysInfo::BigEndian?0:3);

对于(int col=c1;col方法1a:获取原始位并自己动手。您需要充分熟悉位图和模糊算法,以便自己实现模糊。如果您希望达到这种精度,这是一种方法

QImage image = pixmap.toImage();
if (image.format() != QImage::Format_RGB32)
     image = image.convertToFormat(QImage::Format_RGB32);
uchar* bits = image.bits();
int rowBytes = image.bytesPerLine();
DoMyOwnBlurAlgorithm(bits, image.width(), image.height(), rowBytes);
return QPixmap::fromImage(image);
方法1b:谁需要原始位?你可以使用image.pixel(x,y)和image.setPixel(x,y,color)来代替。这不会像1a那么快,但应该更容易理解和编码

QImage image = pixmap.toImage();
QImage output(image.width(), image.height(), image.format());
for (int y=0; y<image.height(); ++y)
   for (int x=0; x<image.width(); ++x)
      output.setPixel(getBlurredColor(image, x, y));
return output;
根据需要调整。例如,我假设默认的图形模糊效果是可以接受的。我在项目中使用方法2。

1st)声明外部QT例程:

QT_BEGIN_NAMESPACE
  extern Q_WIDGETS_EXPORT void qt_blurImage( QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0 );
QT_END_NAMESPACE
第二)使用:


让我们为这个主题做些贡献。从Qt5.3开始,以下函数将帮助您将QGraphicsEffect应用于QImage(并且不会丢失alpha)

使用此功能模糊图像非常简单:

QGraphicsBlurEffect *blur = new QGraphicsBlurEffect;
blur->setBlurRadius(8);
QImage source("://img1.png");
QImage result = applyEffectToImage(source, blur);
result.save("final.png");
当然,你不需要保存它,这只是一个有用的例子。 你甚至可以投下阴影:

QGraphicsDropShadowEffect *e = new QGraphicsDropShadowEffect;
e->setColor(QColor(40,40,40,245));
e->setOffset(0,10);
e->setBlurRadius(50);
QImage p("://img3.png");
QImage res = applyEffectToImage(p, e, 40);

请注意“范围”参数,它将向原始图像的所有侧面添加
范围
像素数,特别适用于阴影和模糊不被切断的情况。

添加基于@ПъПъПъПъПъъПъПъъПъъъП

def applyEffectToImage(src, effect):
    scene = QGraphicsScene()
    item = QGraphicsPixmapItem()
    item.setPixmap(QPixmap.fromImage(src))
    item.setGraphicsEffect(effect)
    scene.addItem(item)
    res = QImage(src.size(), QImage.Format_ARGB32)
    res.fill(Qt.transparent)
    ptr = QPainter(res)
    scene.render(ptr, QRectF(), QRectF(0,0, src.width(), src.height()) )
    return res

blur = QGraphicsBlurEffect()
blur.setBlurRadius(8)
source = QImage(r"C:\Users\fran\Desktop\test.png")
result = applyEffectToImage(source, blur)
result.save(r"C:\Users\fran\Desktop\result.png")

QGraphicsEffects旨在应用于图形视图,而不是pixmaps。然而,Guassian模糊的一般想法是可行的;您只需自己在pixmap上实现算法即可。(不过,转换为QImage可能更快/更容易。)每个人都知道这些算法。但要自己实现它们,我必须有方法:1.将QPixmap转换为2d数组2.将2d数组转换回pixmap的方法。如果您的建议是自己实现,请告诉我如何在QPixmap和2d数组之间转换首先转换为QImage,这样您就可以直接访问像素,然后创建另一个QImage,将卷积内核应用于它并感到高兴:)文档将进一步帮助您有时我想知道为什么会出现质量较低的问题而不是好的问题。到目前为止,您的问题是这个问题的最佳答案。+1我认为liuyanghejerry已经等待了足够长的时间,以获得最佳答案的信任。
QGraphicsBlurEffect *blur = new QGraphicsBlurEffect;
blur->setBlurRadius(8);
QImage source("://img1.png");
QImage result = applyEffectToImage(source, blur);
result.save("final.png");
QGraphicsDropShadowEffect *e = new QGraphicsDropShadowEffect;
e->setColor(QColor(40,40,40,245));
e->setOffset(0,10);
e->setBlurRadius(50);
QImage p("://img3.png");
QImage res = applyEffectToImage(p, e, 40);
def applyEffectToImage(src, effect):
    scene = QGraphicsScene()
    item = QGraphicsPixmapItem()
    item.setPixmap(QPixmap.fromImage(src))
    item.setGraphicsEffect(effect)
    scene.addItem(item)
    res = QImage(src.size(), QImage.Format_ARGB32)
    res.fill(Qt.transparent)
    ptr = QPainter(res)
    scene.render(ptr, QRectF(), QRectF(0,0, src.width(), src.height()) )
    return res

blur = QGraphicsBlurEffect()
blur.setBlurRadius(8)
source = QImage(r"C:\Users\fran\Desktop\test.png")
result = applyEffectToImage(source, blur)
result.save(r"C:\Users\fran\Desktop\result.png")