【问题标题】:Determine which pixels of QImage were changed while painting on it with QPainter确定 QImage 的哪些像素在使用 QPainter 绘画时发生了变化
【发布时间】:2014-03-12 21:54:52
【问题描述】:

我有 Paintable 类,它能够使用作为参数提供的 QPainter 来绘制自己:

class Paintable
{
public:
    virtual void paint(QPainter*) = 0;
};

这个类的实例被绘制在一个 QImage 上:

QImage paint(const std::vector<Paintable*>& paintables) {
    QImage result;
    QPainter p(&result);
    for(int i = 0; i < paintables.size(); ++i) {
        paintables[i]->paint(&p);
    }
    return result;
}

我想要实现的是函数paint也可以形成一个大小等于result图像大小的矩阵,其中每个单元格都包含一个指向Paintable的指针,它在result图像中绘制了相应的像素( z-buffer 之类的东西)。

如果QPainter 的绘制方法以某种方式让我知道QPaintDevice 的哪些像素在上次绘制操作期间被更改,则可以轻松实现。关于如何做的任何想法?我应该创建从QPaintDeviceQPaintEngine 派生的类吗?

我使用的是 Qt 4.6.4。

谢谢。

【问题讨论】:

    标签: c++ qt qpainter qimage


    【解决方案1】:

    也许不是让所有 Paintables 都绘制到同一个 QImage 上,而是让每个绘制到一个临时的空白 QImage 上——即所有像素设置为 RGBA=(0,0,0,0) 的 QImage。这样,在给定 Paintable 的 paint() 方法返回后,您就知道 QImage 中现在不透明的任何像素都必须由该 Paintable 对象绘制。然后,您可以根据该信息更新您自己的 z 缓冲区,如数据结构,然后将 QImage 绘制到单独的“累积 QImage”(假设您还想要合成结果),再次清除临时 QImage,然后根据需要重复。

    【讨论】:

    • 这也是我想到的第一个想法。但我想这样的解决方案会产生巨大的开销。对于高分辨率结果图像,分析每个临时图像可能需要很长时间。但是,如果 QPainter 或 QImage 可以提供更多关于使用/在它们上绘画的信息,那么就不会有任何开销。
    • 如果你可以为每个 Paintable 分配它自己独特的颜色,并保证它只会用那种颜色进行绘制,那么你可以让它们都绘制到同一个 QImage 并使用 QColor->Paintable 贴图最后从像素中获取结果...不知道这是不是一个合理的限制。
    • ... 如果你确实需要多种颜色,你可以做两遍;一个用于单色每个可绘制的“z 缓冲区绘画”(如前一条评论中所述),然后第二次传递给启用实际颜色的第二个 QImage。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多