获取受drawLine()或QLineF影响的点列表

时间:2012-09-10 23:42:29

标签: qt qt4 qpainter

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

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

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

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

我还需要它与其他程序一致,可能会绘制具有相同端点和参数的行,但没有Qt,所以我希望得到相同的结果,并且没有逐个差异。

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

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

2 个答案:

答案 0 :(得分:2)

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

使用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);
}

答案 1 :(得分:0)

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

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