0

ファイルシステムに行って 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);
4

1 に答える 1

2

実はそうです。

すでにほとんどのデータの準備が整っています。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);

注:は charポインターsizeof(char *)のサイズを返すため、最初の行でヘッダーに + 1 行のポインターの配列を割り当てます。配列の最初の「行」をヘッダーに設定した後、メモリ ブロックのアドレス オフセットを残りの「行」にコピーし、それを QPixmap にフィードします。その後、完了です。himg

于 2015-03-26T21:32:25.237 に答える