0

我试图在启动时加载大约 450 帧,然后在我的应用程序的每个循环中,我想从内存中加载图像,而不是从 SDCard 加载图像,因为它非常流 ~ 40 毫秒。

我尝试了以下代码,但我得到了一个空图像。我要加载的图像是灰度图像,1280*960 像素。

我使用以下代码:

        QImage  images[450];

        for (int i=1; i<450;i++)
        {

            sprintf( imFName, "%s/img_%08i.png", imPath.c_str(), i );
            images[i].load(QString(imFName));
            images[i].setColorCount(1);

        }

     for ( int frameIdx = 1;  frameIdx <= 450;  frameIdx++ )
        {
            prevImg = curImg;
            imIndex++;
            printf(" FrameIdx : %d\n", imIndex); fflush(stdout);
            sprintf( imFName, "%s/img_%08i.png", imPath.c_str(), imIndex );

            double t10 = omp_get_wtime();
            QImage curImg;
            bool result = curImg.loadFromData((unsigned char*)images[frameIdx].constBits(),images[frameIdx].byteCount());
            fprintf(stderr, "result %", result);
             if ( curImg.isNull() )
               break;
        }
4

2 回答 2

0

快速查看您的代码,我可以说:

  • 最好QImage images[450];使用某种容器(STL'svector或 Qt's QVector
  • QImage images[450];- 索引 from 0to449和你的循环for (int i=1; i<450;i++)错过images[0]
  • 使用sprintfQt 的字符串QString及其格式化方法。
  • 在这里您尝试访问 450for ( int frameIdx = 1; frameIdx <= 450; frameIdx++ )
  • ...

如果您的代码充满错误。尝试重写它。

做出决定——用 Qt 编写它的类、容器等;或者用 C++ 编写,最少使用 Qt(用于处理一些特殊类型)。

祝你好运!

于 2013-03-12T13:01:09.207 回答
0

顺便说一句,这不是loadFromData的工作方式。从数据加载需要与磁盘上的文件(png 或 jpeg 等)相同的图像数据格式
要从现有数据(如果需要)进行这种复制,您应该使用以下内容:

QImage construct( unsigned char* data, int width, int height, Image::Format format )
{
  return QImage(data, width, height, format);
}

在您的情况下,您应该使用复制作业

于 2013-03-12T14:16:48.053 回答