簡體   English   中英

從 QImage 獲取原始數據

[英]Get raw data from QImage

我有一個從像素圖構建的 QImage,如下所示:

QPixmap fullPmap = topItem->pixmap();
fullPmap = fullPmap.copy(isec.toRect());
QImage chip = fullPmap.toImage();

這基本上與屏幕上的矩形相交,以將圖像裁剪為碎屑大小。

我現在需要從芯片中獲取代表該數據的字符數組。

我怎樣才能做到這一點?

我試過這樣的事情:

  unsigned char * data = chip.bits();

當我顯示“數據”時,我得到一個完全扭曲的圖像,與我的實際芯片完全不同。

如果重要的話,fullPmap 是一個 RGB 圖像。 我有一些代碼用於將其轉換為灰度:

QRgb col;
int gray;
for (int i = 0; i < chip.width(); ++i)
{
    for (int j = 0; j < chip.height(); ++j)
    {
        col = chip.pixel(i, j);
        gray = qGray(col);
        chip.setPixel(i, j, qRgb(gray, gray, gray));
    }
}

我不太喜歡,但這似乎是做這種事情的最簡單方法。

顯示從 bits() 返回的數據如下所示:

imwidth = chip.width();
imheight = chip.height();
QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
//  #pragma omp parallel for
for (int i = 0 ; i < imheight ; i++)
    for (int j = 0 ; j < imwidth ; j++)
    {
        qi->setPixel(j,i,qRgb(data[i*imwidth + j],data[i*imwidth + j],data[i*imwidth + j]));
    }

在處理原始圖像數據時,需要注意一些基本問題:

  • 像素數據的格式或布局是什么。 從 QPixmap 轉換的 QImage 不一定總是 RGB888 或 RGB32。 調用 QImage::format() 並以不同的方式處理不同的布局。 特別是對於 RGB32 系列,您需要確保以正確的字節順序 (endian) 訪問它們。

  • 字節並不總是完全布局那么多字節來保存行的像素。 通常,一行的字節數會比它需要的多。 轉到下一行時,使用 QImage::bytesPerLine() 找出指針並將指針前進那么多字節。 這可能是您在構建顯示圖像時遇到的問題。

  • QImage::pixel() 和 setPixel() 真的很慢。 如果可能,從原始像素緩沖區獲取/設置像素值。

這對我有用:

m_image =  new QImage(IMAGE_WIDTH,IMAGE_HEIGHT, QImage::Format_RGB32);
m_image->fill(Qt::white);
int rawDataCount = 0;
for (int y = 0;y<IMAGE_HEIGHT;y++)
{
    uint* line = (uint*)m_image->scanLine(y);
    for (int x=0;x<IMAGE_WIDTH;x++)
    {
        WORD temp = cameraZero[rawDataCount++];
        BYTE value = temp >> 2;
        QColor grey(value,value,value); 
        line[x] = qRgba(value,value,value,100);
    }
}

其中 cameraZero 保存像素值列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM