在内存 QFile 中使用 fwrite
In Memory QFile with fwrite
我不想去文件系统保存和读回 PGM 图像文件,而是想在内存中执行此操作。我能以某种方式使用 QBuffer 作为内存中的 QFile 来绕过保存到文件系统吗:
QFile filename(QString("/home/pi/frame-%1.pgm").arg(i));
bool didOpen = filename.open(QIODevice::ReadWrite);
qDebug() << "Did open file: " << didOpen << filename.fileName();
int fileHandle = filename.handle();
FILE * f = fdopen(dup(fileHandle), "wb");
int res = fprintf(f, "P5 %d %d 65535\n", w, h);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
uint16_t v = img[y*w+x];
//v = htobe16(v);
res = fwrite((uint8_t*)&v, sizeof(uint16_t), 1, f);
}
}
fclose(f);
QPixmap pixmap;
bool didLoad = pixmap.load(QString("/home/pi/frame-%1.pgm").arg(i));
emit updateScreen(pixmap);
事实上,是的。
您已经准备好大部分数据。我们只需要将它变成QPixmap可以直接读取的格式即可。为此,我们使用 QPixmap(const char *const[] xpm)
构造函数从内存中创建一个像素图。巧合的是,这个构造函数采用了一个指针数组,而不是一个直接数组,这样就不必复制位图数据了!
未经测试的代码:
char *lines[] = (char **)malloc(sizeof(char *) * h + 1); // 1 extra for the header
char header[100];
sprintf(header, "P5 %d %d 65535\n", w, h);
lines[0] = header;
for (int y = 0; y < h; y++) {
lines[y + 1] = (char *)&img[y * w]; // note y+1 offset
}
QPixmap pixmap(lines);
emit updateScreen(pixmap);
free(lines);
注:sizeof(char *)
returns一个char的大小指针,所以在第一行我们分配了一个[=13=的指针数组] 行 + 1 为 header。将数组的第一个 "line" 设置为 header 后,我们将 img
内存块的地址偏移量复制到剩余的 "lines" 并将其提供给 QPixmap。之后我们就完成了。
我不想去文件系统保存和读回 PGM 图像文件,而是想在内存中执行此操作。我能以某种方式使用 QBuffer 作为内存中的 QFile 来绕过保存到文件系统吗:
QFile filename(QString("/home/pi/frame-%1.pgm").arg(i));
bool didOpen = filename.open(QIODevice::ReadWrite);
qDebug() << "Did open file: " << didOpen << filename.fileName();
int fileHandle = filename.handle();
FILE * f = fdopen(dup(fileHandle), "wb");
int res = fprintf(f, "P5 %d %d 65535\n", w, h);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
uint16_t v = img[y*w+x];
//v = htobe16(v);
res = fwrite((uint8_t*)&v, sizeof(uint16_t), 1, f);
}
}
fclose(f);
QPixmap pixmap;
bool didLoad = pixmap.load(QString("/home/pi/frame-%1.pgm").arg(i));
emit updateScreen(pixmap);
事实上,是的。
您已经准备好大部分数据。我们只需要将它变成QPixmap可以直接读取的格式即可。为此,我们使用 QPixmap(const char *const[] xpm)
构造函数从内存中创建一个像素图。巧合的是,这个构造函数采用了一个指针数组,而不是一个直接数组,这样就不必复制位图数据了!
未经测试的代码:
char *lines[] = (char **)malloc(sizeof(char *) * h + 1); // 1 extra for the header
char header[100];
sprintf(header, "P5 %d %d 65535\n", w, h);
lines[0] = header;
for (int y = 0; y < h; y++) {
lines[y + 1] = (char *)&img[y * w]; // note y+1 offset
}
QPixmap pixmap(lines);
emit updateScreen(pixmap);
free(lines);
注:sizeof(char *)
returns一个char的大小指针,所以在第一行我们分配了一个[=13=的指针数组] 行 + 1 为 header。将数组的第一个 "line" 设置为 header 后,我们将 img
内存块的地址偏移量复制到剩余的 "lines" 并将其提供给 QPixmap。之后我们就完成了。