簡體   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