如何阅读我的应用程序屏幕像素数据与Qt
我想在我的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 ...
是否有任何替代方法快速读取我的屏幕像素数据?谢谢
我不确定是否使用QTextStream
并将数据转换为QString
然后回到QByteArray
是最好的方法。如解释in Qt's documentation从QByteArray
构建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());
// ...
}
我已经尝试了文中提到的写法,但在输出文件中没有发现任何区别。我现在要检查抓斗窗口。 :)谢谢你的帖子。 – Abin
噢,好吧,希望另一个至少提高性能......我已经更新了答案,以包含一些关于帧缓冲区格式的选项。 – cbuchart
我试过第二个选项,并且在我的电脑中看起来很快,但是当我在嵌入式设备'grabwindow()'中运行相同的结果时返回null。我的代码是'QScreen * screen = QGuiApplication :: primaryScreen(); QPixmap pixmap = QPixmap(); QTime定时器; 定时器。开始(); pixmap = screen-> grabWindow(0); qDebug() Abin