首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模糊QImageα通道

模糊QImageα通道
EN

Stack Overflow用户
提问于 2016-02-08 13:29:22
回答 1查看 322关注 0票数 1

我在试图模糊QImageα频道。我目前的实现使用了废弃的'alphaChannel‘方法,并且工作缓慢。

代码语言:javascript
复制
QImage blurImage(const QImage & image, double radius)
{
  QImage newImage = image.convertToFormat(QImage::Format_ARGB32);

  QImage alpha = newImage.alphaChannel();
  QImage blurredAlpha = alpha;
  for (int x = 0; x < alpha.width(); x++)
  {
    for (int y = 0; y < alpha.height(); y++)
    {
      uint color = calculateAverageAlpha(x, y, alpha, radius);
      blurredAlpha.setPixel(x, y, color);
    }
  }
  newImage.setAlphaChannel(blurredAlpha);

  return newImage;
}

我还试图使用QGraphicsBlurEffect实现它,但它不影响alpha。

QImageα通道模糊的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-08 13:59:21

我遇到了一个similar question about pixel read\write access

  1. 扭转你的循环。在内存中,图像是作为一系列行排列的。所以你应该先按高度再按宽度来访问。
  2. 使用QImage::scanline访问数据,而不是使用昂贵的QImage::pixelQImage::setPixel。扫描(又称行)中的像素保证是连续的。

您的代码如下所示:

代码语言:javascript
复制
for (int ii = 0; ii < image.height(); ii++) {
    uchar* scan = image.scanLine(ii);
    int depth =4;
    for (int jj = 0; jj < image.width(); jj++) {
        //it is in fact an rgba
        QRgb* rgbpixel = reinterpret_cast<QRgb*>(scan + jj*depth);
        QColor color(*rgbpixel);
        int alpha = calculateAverageAlpha(ii, jj, color, image);
        color.setAlpha(alpha);

        //write
        *rgbpixel = color.rgba();
    }
}

您可以进一步优化alpha平均值的计算。让我们来看看半径中像素的总和。半径中α值(x,y)之和为s(x,y)。当您在任一方向移动一个像素时,会添加一条单线,而删除一条单线。假设你水平移动。如果l(x,y)是以(x,y)为中心的长度为(x,y)的垂直线之和,那么

代码语言:javascript
复制
  s(x + 1, y) = s(x, y) + l(x + r + 1, y) - l(x - r, y)

它允许您在第一次传递时有效地计算和矩阵(然后用像素数除以平均值)。

我怀疑这种优化已经在诸如opencv这样的库中以更好的方式实现了。因此,如果您希望节省时间,我鼓励您使用现有的opencv函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35270843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档