• 23302阅读
  • 10回复

[提问]QImage类的loadFromData函数用法请教——关于QBuffer::seek: Invalid pos警告! [复制链接]

上一主题 下一主题
离线tina_lulu_21
 

只看楼主 倒序阅读 楼主  发表于: 2014-01-24
大家好!
我现在在用QT做一个基于摄像头的视频监控程序。在使用QImage类时遇到一个问题,向大家请教!

我首先将摄像头拍摄的图像数据读入一个unsigned char的数组rgb_buffer,然后用一个QByteArray结构的变量aa将BMP头和图像数据rgb_buffer放在一起,最后,然后将aa通过loadFromData函数赋给一个QImage变量。具体代码如下:
frame = new QImage(rgb_buffer,640,480,QImage::Format_RGB888);
QByteArray aa((const char*)0,14+40+640*480*3);    
aa.append((char *)&bf,14);  
aa.append((char *)&bi,40);    
aa.append((char *)rgb_buffer,640*480*3);  
bool flag;    
flag = frame->loadFromData(aa,"BMP");
这样写程序可以编译执行,但是在程序执行到 flag = frame->loadFromData(aa,"BMP");这句时总是会输出一个警告:QBuffer::seek: Invalid pos: 3538944

我不知道这个警告是怎么产生的,是不是loadFromData的用法不对?我将QImage的变量指针frame写成Widget类的一个成员变量了。是不是这里有问题?

离线dbzhang800

只看该作者 1楼 发表于: 2014-01-24
直接用第一行代码不就够了吗?
离线tina_lulu_21

只看该作者 2楼 发表于: 2014-01-24
我使用来显示视频的,所以QImage要不不断赋值,所以我就在一开始new一次,中间用loadFromData赋值, 最后用完再delete
离线dbzhang800

只看该作者 3楼 发表于: 2014-01-24
回 tina_lulu_21 的帖子
tina_lulu_21:我使用来显示视频的,所以QImage要不不断赋值,所以我就在一开始new一次,中间用loadFromData赋值, 最后用完再delete (2014-01-24 16:08) 

按你所说,图像数据读入一个unsigned char的数组rgb_buffer

如果直接用第一行代码,它buffer的内容不就是变的么?
离线tina_lulu_21

只看该作者 4楼 发表于: 2014-01-24
是的,是变的。我本意是不想每次都new和delete. 按你说的我试了一下,确实没有警告了。但我不知道原因,请赐教!非常感谢!
离线tina_lulu_21

只看该作者 5楼 发表于: 2014-01-24
原来的方法为什么会出现QBuffer::seek: Invalid pos XXXX 警告呢?
离线dbzhang800

只看该作者 6楼 发表于: 2014-01-24
回 tina_lulu_21 的帖子
tina_lulu_21:原来的方法为什么会出现QBuffer::seek: Invalid pos XXXX 警告呢? (2014-01-24 16:31) 

估计你自己写的bmp的头有问题吧
离线dbzhang800

只看该作者 7楼 发表于: 2014-01-24
回 tina_lulu_21 的帖子
tina_lulu_21:是的,是变的。我本意是不想每次都new和delete. 按你说的我试了一下,确实没有警告了。但我不知道原因,请赐教!非常感谢! (2014-01-24 16:28) 

你不需要一次次new和delete。一个就够了

因为你的数据是变的,假设 40frames/s,那么你每25ms 显示一次该QImage,就是视频效果
离线彩阳

只看该作者 8楼 发表于: 2014-01-24
QImage是隐式共享的,所以不必new和delete。
上海Qt开发联盟,热忱地欢迎你的加入!
离线tina_lulu_21

只看该作者 9楼 发表于: 2014-01-24
不用new和delete应该怎么写呢?请楼上两位指教!万分感谢!我是新手,不懂呢
离线noidea

只看该作者 10楼 发表于: 2014-01-27
之所以没有警告是以为 frame = new QImage(rgb_buffer,640,480,QImage::Format_RGB888); 已经创建了一个24位的bmp文件(QImage::Format_RGB888指定了bmp格式),这个bmp头你不要自己添加。

而你后边的调整都是对这个bmp文件的破坏,所以他就抱怨找不到正确的位置。



talk in code
Qt5.2.1 + MacOSX10.9
快速回复
限100 字节
 
上一个 下一个