2013-03-12 61 views
0

我試圖在啓動時加載大約450幀,然後在我的應用程序的每個循環中,我想從內存中加載圖像,而不是從SDCard加載,因爲它非常流暢〜 40毫秒。啓動時從內存中加載QImages

我試過下面的代碼,但是我得到一個空的圖像。我想要加載的圖像是灰度圖像,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; 
     } 
+0

和錯誤是最有可能在你沒有張貼代碼,因爲它應該工作的罰款。你檢查了緩衝區溢出嗎? – 2013-03-12 12:50:25

+0

有沒有很好的理由,你不能只寫'QImage curImg = images [frameIdx];'? – 2013-03-12 12:51:42

+0

@BЈовић結果給SetColorCount圖像NULL – Andre 2013-03-12 12:55:56

回答

0

在快看看你的代碼,我可以說:

  • insted的的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(用於處理某些特殊類型)。

祝你好運!

0

順便說一下,它不是如何loadFromData工作。從數據加載需要與在磁盤上的文件(png或jpeg等)中相同的圖像數據格式
要從現有數據(如果您需要)製作這種副本,您應該使用類似於以下的內容:

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

在你的情況,你應該使用拷貝賦值