如何使用Qt读取我的应用程序屏幕像素数据
How to read my application screen pixel data with Qt
我正在尝试在我的Qt Qml应用程序中读取我的应用程序屏幕像素数据。
第一种方法是grabToImage()
,这在我的 PC 中很快。但同样需要几秒钟才能在我的嵌入式设备中抓取图像。
所以我试着用QFile::readAll
来阅读/dev/fb0
,
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
是否是最好的方法。正如Qt的文档中所解释的,从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
此链接包含有关从/dev/fb0
设备获取帧缓冲的详细说明。基本上,它指出您必须注意缓冲区的深度,因为像素可能以不同的方式打包。
另一方面,您是否尝试过Qt提供的其他抓取方法,例如QScreen::grabWindow
?也许它的性能比 QML 的QQuickItem::grabToImage
更好(我猜你正在使用的那个)。事实上,文档指出:
此函数会将项目渲染到屏幕外的表面,并将该表面从 GPU 的内存复制到 CPU 的内存中,这可能非常昂贵。
以下代码是对屏幕截图示例的修改。
auto screen = QGuiApplication::primaryScreen();
if (const QWindow *window = windowHandle()) {
screen = window->screen();
}
if (screen) {
const auto pixmap = screen->grabWindow(yourWidget->winId());
// ...
}
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 如何在屏幕周围生成随机像素
- 带有屏幕像素的 glReadPixel 像素
- 如何使用Qt读取我的应用程序屏幕像素数据
- 从屏幕 HDC 保存像素
- 如何使对准对象自动筛选为屏幕,以便于像素网格
- OpenGL使用glfw通过HIDDEN窗口进行屏幕外渲染和读取像素值
- OpenGL ES坐标到屏幕像素
- 在屏幕上绘制一个像素
- 如何在 OpenGL 中查找屏幕上给定像素的相应基元或顶点
- OpenGL透视投影来映射屏幕像素
- 如何在 x11 中获取屏幕像素的颜色
- OSX以最小的延迟将像素推到屏幕上
- 像素图屏幕截图转换为低质量