我是 Qt 的新手,我一直在嘗試開發一個簡單的視頻流應用程式。
在開發我的應用程式時,我遇到了一個我認為一開始可以忽略的問題,但事實并非如此。事實上,這個問題正在減慢我的整個應用程式并使其無法正常作業。
這是我的問題:當我嘗試顯示許多影像時,我有 2 個選擇:
使用 QImage 建構式 QImage(uchar *data, int width, int height, QImage::Format format) 構造影像并顯示。它按預期作業,但非常非常慢
或者使用 QImage::loadFromData(uchar *, int len) 加載影像的資料,這根本不起作用。
這是我的作業代碼:
void MainWindow::startCapturing()
{
timer->start();
// on press of a button, the timer will call repeatedly the generateImage() function
}
void MainWindow::generateImage()
{
det->GetImage(&image); // fulfill my image with data
myImage=QImage((uchar*)image.GetValuePointer(),image.GetSize().height,image.GetSize().width,
QImage::Format_Grayscale16);
// here GetValuePointer returns a void *, that's why we had to cast it.
ui->img_label->setPixmap(QPixmap::fromImage(myImage));
}
這是我不作業的代碼
void MainWindow::startCapturing2()
{
myImage=QImage((uchar*)image.GetValuePointer(),image.GetSize().height,image.GetSize().width,
QImage::Format_Grayscale16);
ui->img_label->setPixmap(QPixmap::fromImage(myImage));
timer->start();
// on press of a button, the timer will call repeatedly the generateImage() function
}
void MainWindow::generateImage2()
{
det->GetImage(&image);
myImage.loadFromData((uchar *)image.GetValuePointer(), image.GetSizeInBytes());
// same cast of GetValuePointer as above
ui->img_label->setPixmap(QPixmap::fromImage(myImage));
}
有關代碼的資訊:
det->GetImage(&image) 在這里實作我的名為 image 的 Image 物件。
影像是我自己的型別,因為我正在使用特定的相機并且必須這樣做,它更多的是在硬體方面,不要為此煩惱。
image.GetValuePointer() 將影像的資料作為 void * 回傳,以便轉換為您想要的任何內容。
也不要打擾 timer() 和 startCapturing(),它正在作業,這不是主題的重點。
在 StartCapturing2 中,我正在嘗試創建 QImage,并設定像素圖,以便如果我使用 loadFromData 更新 myImage,它將更改顯示的影像。
我一直在嘗試很多事情,比如很多事情,例如使用 QByteArray 但它要么不起作用,要么根本不是我想要的。
如果您有任何問題,請向他們提問,我會盡力盡快和最好地回答!謝謝!
uj5u.com熱心網友回復:
您沒有為format引數loadFromData()(默認值為nullptr)提供任何值,因此很可能會QImage嘗試查找影像標題,但找不到任何影像標題并放棄,無法處理以下資料。
加載器嘗試使用指定的格式(例如 PNG 或 JPG)讀取影像。如果未指定格式(這是默認值),加載程式會探測檔案以查找檔案頭以猜測檔案格式。
附帶說明一下,您的第二個選項可能比第一個選項更慢,因為它復制資料,而第一個選項使用影像中的現有資料。請參閱建構式檔案(強調我的):
QImage::QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)構造一個使用現有只讀記憶體緩沖區data的影像 [...] 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/489347.html
