• 11838阅读
  • 11回复

图像显示刷新太慢了,有经验的前辈指点 [复制链接]

上一主题 下一主题
离线mpx1983
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-22
我用qt写了一个功能,显示一幅图像;
然后按下左键拖动鼠标用来调整图像亮度,现在功能已经实现了,但就是卡的非常厉害;
我的鼠标拖动的代码如下:
  1. void QtDicomGraphicsView::mouseMoveEvent(QMouseEvent *event)
  2. {
  3.     if(m_bLeftButtonDown == TRUE)
  4.     {
  5.           char* pImageData = m_DicomView->ChangeData(dX*4,dY*7);
  6.           if(m_GraphicsImage != NULL)
  7.             delete m_GraphicsImage;
  8.         m_GraphicsImage = new QImage((uchar*)pImageData, m_DicomView->m_nCols, m_DicomView->m_nRows, m_DicomView->m_nCols, QImage::Format_Indexed8);
  9.         m_GraphicsImage->setColorTable(m_colorTable);
  10.         if(m_GraphicsPixmap != NULL)
  11.             delete m_GraphicsPixmap;
  12.         m_GraphicsPixmap = new QPixmap(QPixmap::fromImage(*m_GraphicsImage));// myPixmap(QPixmap::fromImage(*myImage));
  13.         m_DicomGraphicsScens->addPixmap(QPixmap(*m_GraphicsPixmap));
  14.         //m_DicomGraphicsScens->update();
  15.         this->update();
  16.         //this->repaint();
  17.     }
  18. }


我是在每次鼠标移动的响应事件中,出发一次亮度调整,拿到调整后的像素数据,然后生成QImage,在根据QImage生成Qpixmap,用来显示;我是将QPixmap加载到QGraphicsView框架上显示的;
请问刷新显示慢的原因出在了那里??如何才可以很流畅的实现此功能,请有经验的前辈指点
离线dbzhang800

只看该作者 1楼 发表于: 2009-11-22
这种耗时的操作,至少要开线程来做吧

再就是对moveevent的响应,是不是要控制到每秒不超过24次?
离线mpx1983

只看该作者 2楼 发表于: 2009-11-23
创建线程的意义不大的,因为我是必须拿到调整后的图像才可以显示的,所以他们之间是个串行的关系,没意义开线程;
moveevent的响应次数太频繁了? 为什么要控制在24次?
相同的算法在windows下用vc来实现,非常的流畅;
最大的可能是我没用好qt,查到了一些资料,有个qt官方的文章,说是用GraphicsView+OpenGL来实现
有没有其他前辈给点思路
离线wqb_lmkj
只看该作者 3楼 发表于: 2009-11-23
qt 用的是 帧缓存 ,完全靠CPU 计算,运行的时候CPU占用率100%,同样的问题
离线kingnight
只看该作者 4楼 发表于: 2009-11-23
能不能不进行QImage到Qpixmap的转换?这个很消耗cpu的,而且不能硬件加速
离线蛮蛮
只看该作者 5楼 发表于: 2009-11-23
建议不要每次都重新new一个对象,使用loadFromData照理应该好些.
蛮蛮工作室
离线nmiirq

只看该作者 6楼 发表于: 2009-11-23
慢的问题主要是QImage的处理。那个很慢的!
离线mpx1983

只看该作者 7楼 发表于: 2009-11-23
我已经拿到图像的数据部分,也知道图像基本信息(例如宽,高,等),如何可以快速的将其显示到屏幕;
各位说的不要QImage-->QPixmap的转换,或者Qimage很耗时,但如果要避免这个过程我该怎么写代码呢
离线mpx1983

只看该作者 8楼 发表于: 2009-11-26
再顶一下,问题还未解决。。。
离线zhangxudong

只看该作者 9楼 发表于: 2009-11-26
1.调用GraphicsView对象的setViewport(new QGLWidget)使用OpenGL来Render位图。
2.从QGraphicsRectItem派生一个图元,图元的大小和你的Image一样大,重新实现paint接口
void ImageRect::paint(QPainter *painter,
                           const QStyleOptionGraphicsItem *option,
                           QWidget *widget)
{
     painter->drawImage;
}
离线mpx1983

只看该作者 10楼 发表于: 2009-11-27
多谢 zhangxudong 的回复
我尽快按你提供的方法进行下尝试
离线langzi

只看该作者 11楼 发表于: 2011-11-02
这个问题解决了吗?
快速回复
限100 字节
 
上一个 下一个