2017-05-09 53 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

相关问题