【发布时间】:2019-09-16 02:30:30
【问题描述】:
我需要将库中保存的像素数据绘制为uint8_t *,并且经常和部分更新。每次更新完成时,我都会收到来自库的回调,如下所示:
void gotFrameBufferUpdate(int x, int y, int w, int h);
我尝试使用像素数据指针创建QImage
QImage bufferImage(frameBuffer, width, height, QImage::Format_RGBX8888);
并让我的小部件的回调触发update()
void gotFrameBufferUpdate(int x, int y, int w, int h)
{
update(QRect(QPoint(x, y), QSize(w, h)));
}
它只是通过paint() 绘制QImage 的更新区域:
void MyWidget::paint(QPainter *painter)
{
QRect rect = painter->clipBoundingRect().toRect();
painter->drawImage(rect, bufferImage, rect);
}
这种方法的问题是QImage 似乎没有反映像素缓冲区的任何更新。它一直显示其初始内容。
我目前的解决方法是在每次更新缓冲区时重新创建一个 QImage 实例:
void gotFrameBufferUpdate(int x, int y, int w, int h)
{
if (bufferImage)
delete bufferImage;
bufferImage = new QImage(frameBuffer, width, height,
QImage::Format_RGBX8888);
update(QRect(QPoint(x, y), QSize(w, h)));
}
这可行,但对我来说似乎效率很低。有没有更好的方法来处理 Qt 中外部更新的像素数据?我可以让我的QImage 知道其内存缓冲区的更新吗?
(背景:我正在编写一个带有 C++ 后端的自定义 QML 类型,该类型应显示 VNC 会话的内容。我为此使用 LibVNC/libvncclient。)
【问题讨论】:
-
“我当前的解决方法是在每次更新缓冲区时重新创建一个 QImage 实例” - 我看不出有什么问题,因为这基本上是
QImage本身必须做的如果被告知其内存缓冲区已更改-它将不得不丢弃所有内容并重新创建自己。那么,有什么问题呢? -
基于
QImage构造函数文档中的“缓冲区必须在QImage的生命周期内保持有效”警告,看起来QImage保留了提供给构造函数的uchar指针,而不是制作复制到内部缓冲区中。 -
如果缓冲区内只有几个字节值发生了变化,为什么它需要重新创建自己?我会理解重新创建图像格式或缓冲区尺寸的变化,但这都是静态的。
-
@akoch 根据更改的字节和图像格式,它可能需要重新解释许多其他图像字节。简单的方法是在任何更改时从头开始重新解析图像数据。
标签: c++ qt vnc-viewer