Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 带fwrite的内存QFile_Linux_Qt_Qt5_Qpixmap_Qbytearray - Fatal编程技术网

Linux 带fwrite的内存QFile

Linux 带fwrite的内存QFile,linux,qt,qt5,qpixmap,qbytearray,Linux,Qt,Qt5,Qpixmap,Qbytearray,我不想去文件系统保存并读回PGM映像文件,而是想在内存中执行此操作。我是否可以使用QBuffer作为内存中的QFile来绕过保存到文件系统: QFile filename(QString("/home/pi/frame-%1.pgm").arg(i)); bool didOpen = filename.open(QIODevice::ReadWrite); qDebug() << "Did open file:

我不想去文件系统保存并读回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);
QFile文件名(QString(“/home/pi/frame-%1.pgm”).arg(i));
bool didOpen=filename.open(QIODevice::ReadWrite);
实际上,是的

您已经准备好了大部分数据。我们只需要将其转换为QPixmap可以直接读取的格式。为此,我们使用
QPixmap(const char*const[]xpm)
构造函数从内存生成一个pixmap。巧合的是,这个构造函数采用了指针数组,而不是直线数组,这样就不用复制位图数据了

未测试代码:

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);
char*行[]=(char**)malloc(sizeof(char*)*h+1);//1个额外的标题
字符头[100];
sprintf(标题,“P5%d%d 65535\n”,w,h);
行[0]=标题;
对于(int y=0;y
注意:
sizeof(char*)
返回char指针的大小,因此在第一行中,我们为标头分配一个
h
行+1的指针数组。在将数组的第一个“行”设置到报头后,我们将
img
内存块的地址偏移复制到剩余的“行”中,并将其馈送到QPixmap。然后我们就结束了