2017-05-09 56 views
1

我想在我的Qt Qml應用程序中閱讀我的應用程序屏幕像素數據。如何閱讀我的應用程序屏幕像素數據與Qt

第一種方法是grabToImage(),這在我的電腦中很快。但同樣需要幾秒鐘才能在我的嵌入式設備中抓取圖像。

於是,我就閱讀/dev/fb0,使用QFile::readAll

QFile file("/dev/fb0"); 
QFile dataFile("/home/icu/WorkSpace/Samples/FBRead/Exe/data.bin"); 

if(!file.open(QIODevice::ReadOnly)) 
{ 
    qDebug() << Q_FUNC_INFO << file.errorString(); 
} 

if(!dataFile.open(QIODevice::WriteOnly)) 
{ 
    qDebug() << Q_FUNC_INFO << dataFile.errorString(); 
} 

QTextStream in(&file); 

QString data; 
qDebug() << Q_FUNC_INFO << "start read"; 

// while(!in.atEnd()) 
// { 
     qDebug() << Q_FUNC_INFO << "read"; 
     data = in.readAll(); 
//  qDebug() << Q_FUNC_INFO << data; 
// } 

QByteArray dataBytes; 
dataBytes.append(data); 

dataFile.write(dataBytes); 

file.close(); 
dataFile.close(); 

我試圖打開文件的一些工具,可以顯示圖像從原始文件中讀取。但它沒有顯示任何數據。當我打開文件數據就像01 01 01 00 01 01 01 00 ...

是否有任何替代方法快速讀取我的屏幕像素數據?謝謝

回答

1

我不確定是否使用QTextStream並將數據轉換爲QString然後回到QByteArray是最好的方法。如解釋in Qt's documentationQByteArray構建QString將強制轉換爲UTF-8,並停止在第一個空字符處進行復制,因此您正在修改像素數據並未完全獲取它。嘗試文件之間直接複製數據,而不是:

bool grabScreenToFile(const QString& outPath) { 
    QFile inFile("/dev/fb0"); 
    QFile outFile(outPath); 

    // ... 

    outFile.write(inFile.readAll()); 

    return true; 
} 

要檢查,如果這是複製文件的實際內容,你有沒有問題,它(截斷,轉換,...​​),與文件比較獲得的使用cat /dev/fb0 > grab.raw(請注意,它不是JPEG或PNG圖像,而是原始緩衝區)。


的/ dev/FB0

This link包含有關從/dev/fb0設備抓取幀緩衝器長的解釋。基本上,它指出你必須注意緩衝區的深度,因爲像素可能以不同的方式打包。


在另一方面,你嘗試過其他任何Qt提供的抓方法,如QScreen::grabWindow?也許它的性能更好,QML的QQuickItem::grabToImage(這是我猜你正在使用的那個)。事實上,文檔指出:

此功能將渲染該項目到離屏表面並將該表面從GPU內存複製到CPU的內存,這可能會非常昂貴。

以下代碼是對screenshot example的修改。

auto screen = QGuiApplication::primaryScreen(); 
if (const QWindow *window = windowHandle()) { 
    screen = window->screen(); 
} 
if (screen) {  
    const auto pixmap = screen->grabWindow(yourWidget->winId()); 
    // ... 
} 
+0

我已經嘗試了文中提到的寫法,但在輸出文件中沒有發現任何區別。我現在要檢查抓鬥窗口。 :)謝謝你的帖子。 – Abin

+0

噢,好吧,希望另一個至少提高性能......我已經更新了答案,以包含一些關於幀緩衝區格式的選項。 – cbuchart

+0

我試過第二個選項,並且在我的電腦中看起來很快,但是當我在嵌入式設備'grabwindow()'中運行相同的結果時返回null。我的代碼是'QScreen * screen = QGuiApplication :: primaryScreen(); QPixmap pixmap = QPixmap(); QTime定時器; 定時器。開始(); pixmap = screen-> grabWindow(0); qDebug()<< Q_FUNC_INFO <<「time elapsed」<< timer.elapsed()<<「ms」; qDebug()<< Q_FUNC_INFO <<「pixmap is null」<< pixmap.isNull(); qDebug()<< Q_FUNC_INFO <<「保存爲」<< pixmap.save(「/ opt/img.png」); qDebug()<< Q_FUNC_INFO <<「Exits」;' – Abin

相關問題