在启动时从内存加载图像

时间:2013-03-12 12:38:42

标签: c++ qt

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

我尝试了以下代码,但是我得到了一个空图像。我要加载的图像是灰度图像,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;
        }

2 个答案:

答案 0 :(得分:0)

快速查看代码,我可以这样说:

  • QImage images[450];最好使用某种容器(STL的vector或Qt的QVector
  • QImage images[450]; - 索引从0449,您的周期for (int i=1; i<450;i++)错过images[0]
  • 使用sprintf时,请使用Qt的字符串QString及其格式化方法。
  • 在这里,您尝试访问450 for ( int frameIdx = 1; frameIdx <= 450; frameIdx++ )
  • ...

您的代码是否充满错误。 尝试重写它。

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

祝你好运!

答案 1 :(得分:0)

顺便说一下loadFromData的工作原理并非如此。从数据加载需要与在磁盘上的文件(png或jpeg等)中相同的图像数据格式 要从现有数据中制作这种副本(如果您需要),您应该使用以下内容:

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

在您的情况下,您应该使用副本分配