我正在尝试在启动时加载大约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;
}
答案 0 :(得分:0)
快速查看代码,我可以这样说:
QImage images[450];
最好使用某种容器(STL的vector
或Qt的QVector
)QImage images[450];
- 索引从0
到449
,您的周期for (int i=1; i<450;i++)
错过images[0]
。sprintf
时,请使用Qt的字符串QString
及其格式化方法。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);
}
在您的情况下,您应该使用副本分配