我想知道修改QImage的一部分的最快方法是什么。
我有这段代码必须以30Hz的频率执行。它通过一种钥匙孔显示图像。无法看到整个图像,只能看到圆圈内的一部分。第一个for-loop擦除前一个“显示的锁孔部分”,第二个更新“显示的锁孔”的位置。
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是否有更好的替代方案?
答案 0 :(得分:1)
如何预呈现你的钥匙孔&#39;在数组/ qimage中并与源进行按位AND?
你在最里面的循环中有很多条件(虽然有些可以移出)但是使用乘法和除法的圆半径计算看起来很昂贵。您可以为每个帧重用锁孔掩码,因此无需执行任何计算。
答案 1 :(得分:0)
答案 2 :(得分:0)
实际上我理解它不是像素访问那么慢,而是渲染。 在测试期间,我使用了纯色图像,但这些图像比从文件加载的复杂图像快得多。通过其他测试,我意识到渲染速度很慢。
渲染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();
答案 3 :(得分:-1)
据我所知,访问QImage数据的最快方法是使用QImage :: bits(),它可以直接访问QImage的数据。
对于你的问题,一个更好的approch将像Bgie建议的那样:使用表示锁孔的数组并仅执行按位AND操作。
它将有助于为您的图像选择正确的格式,格式RGB32和ARG32_Premultiplied_ARGB32是最快的。如果您不需要,请不要使用ARGB32。