2

如何获取 drawLine() 函数影响的点/坐标列表?例如,如果我有

QLineF line(10.0, 80.0, 90.0, 20.0);
QPainter(this);
painter.drawLine(line);

我想获取 drawLine() 将绘制的 QPoint 坐标列表。我知道Bresenham 的 line algorithm,但是我需要它在更一般的情况下工作,我可以设置不同的 QPen 和 QBrush:

painter.setPen(QPen(myColor, myWidth, Qt::SolidLine, Qt::RoundCap));

我还需要它与可能绘制具有相同端点和参数但没有 Qt 的线的其他程序保持一致,因此我希望最终得到相同的结果,并且没有完全不同的差异。

注意:这与这个问题不同,因为我需要所有将受绘图功能影响的像素,而不仅仅是多边形/路径的顶点。

更新:我认为可以将 QImage 或 QPainterDevice 和 QPaintEngine 子类化以捕获所有“setPixel()”操作。任何人都可以证明或确认,甚至可能编写一个短代码来做到这一点吗?

4

2 回答 2

2

不确定您的性能要求,但您可以在屏幕外渲染线条,然后查看图像以查看绘制了哪些像素。这是一个示例,它打印在 400x400 图像上从 190,190 到 210,210 的 3 像素线之间绘制的像素。

使用 QImage 时,出于性能原因,请务必使用 scanLine() 函数。

#include <QCoreApplication>
#include <QImage>
#include <QPainter>
#include <QDebug>

int main(int argc, char *argv[])
{
    QImage image(400,400,QImage::Format_ARGB32);
    QPainter painter;
    painter.begin(&image);
    painter.fillRect(0,0,400,400,QBrush(Qt::white));
    QBrush brush(Qt::black);
    QPen pen(brush, 3.0);
    painter.setPen(pen);
    painter.drawLine(190,190,210,210);
    painter.end();

    for (int i=0;i<image.height();i++) {
        const uchar *scanLine = image.scanLine(i);
        for (int j=0;j<image.width()*4;j+=4) {
            if ( scanLine[j] == 0 ) {
                qDebug() << "pixel" << i << j/4 << scanLine[j];
            }
        }
    }

    return (0);
}
于 2012-09-11T03:46:47.643 回答
0

所覆盖的确切像素甚至不一定在 Qt 程序中保持一致。如果在 上打开抗锯齿QPainter会有所不同,如果绘制到 aQGLWidget会有所不同,并且可能会根据程序运行的平台而有所不同,因为 Qt 具有不同的QPaintEngine实现,不一定会完全生成相同的输出。

简而言之,您所要求的只是不可能的。您只能找到特定绘制操作所覆盖的像素,并且只能通过采用 mzelina 建议的方法来做到这一点。

于 2012-09-18T15:33:11.393 回答