繁体   English   中英

在QImage中访问像素的最快方法是什么?

[英]What is the fastest way to access a pixel in QImage?

我想知道修改QImage的一部分的最快方法。

我有一段必须以30Hz的频率执行的代码。 它通过某种钥匙孔显示图像。 无法看到整个图像,而只能看到圆内的一部分。 第一个for循环擦除先前的“显示的钥匙孔部分”,第二个更新“显示的钥匙孔”的位置。

for (int i = (prev_y - r_y); i < (prev_y + r_y); i++){
        QRgb *line = (QRgb *)backgrd->scanLine(i);
        for(int j = (prev_x - r_x); j < (prev_x + r_x) ; j++){
            if((i >= 0 && i < this->backgrd->height()) && (j >= 0 && j < this->backgrd->width()))
                line[j] = qRgb(0,0,0);
        }
    }
    prev_x = new_x; prev_y = new_y;

    for (int i = (new_y - r_y); i < (new_y + r_y); i++){
        QRgb *line = (QRgb *)backgrd->scanLine(i);
        QRgb *line2 = (QRgb *)this->picture->scanLine(i);
        for(int j = (new_x - r_x); j < (new_x + r_x) ; j++){
            if ((((new_x - j)*(new_x - j)/(r_x*r_x) + (new_y - i)*(new_y - i)/(r_y*r_y)) <= 1) && (i >= 0) && (i < this->picture->height())&& (j >= 0) && (j < this->picture->width()))
                line[j] = line2[j];
        }
    }
    this->current_img = this->backgrd;
}
this->update(); //Display QImage* this->current_img

如果我分析程序的时间戳,每次执行时都会发现执行流程存在延迟...访问QImage中的像素是否耗费这么大的精力? 难道我做错了什么? Qt程序是否有更好的替代QImage的方法?

如何在数组/ qimage中预渲染“锁孔”并与源进行按位与运算呢?

  • 原始像素&&黑色=>黑色
  • 原始像素&&白色=>原始像素

在最里面的循环中有很多条件(尽管有些条件可以移出),但是使用乘除法的圆半径计算看起来很昂贵。 您可以在每个帧中重复使用锁眼掩模,因此无需执行任何计算。

  • 您可以将某些条件至少移到外部循环,并可以预先计算条件中的某些项,尽管无论如何都可以对其进行优化。
  • 仅针对您修改的矩形调用更新
  • 您从哪里获得时间戳记? 也许您在其他地方浪费时间?

实际上,我知道不是像素acces较慢 ,而是渲染。 在测试中,我确实使用了单色图像,但是与从文件加载的复杂图像相比,此类图像的渲染速度要快得多。 通过其他测试,我意识到渲染速度很慢。

渲染QImage最快的方法是首先使用

public: static QImage QGLWidget::convertToGLFormat(const QImage &img)

然后可以快速处理图像(保留bits()scanline()width()和height()函数),并可以通过openGL快速显示(无需进一步转换)

QPainter painter(this);
glDrawPixels(img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
painter.end();

据我所知,访问QImage数据的最快方法是使用QImage :: bits(),它可以直接访问QImage的数据。

对于您的问题,更好的方法是按照Bgie的建议进行操作:使用表示钥匙孔的数组,并仅执行按位AND操作。

它将有助于为您的图像选择正确的格式,最快的格式是RGB32和ARG32_Premultiplied_ARGB32。 如果不需要,请不要使用ARGB32。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM