【问题标题】:Get list of points affected by drawLine() or QLineF获取受 drawLine() 或 QLineF 影响的点列表
【发布时间】:2012-09-10 23:42:29
【问题描述】:

如何获取 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()”操作。任何人都可以证明或确认,甚至可以编写一个短代码来做到这一点吗?

【问题讨论】:

    标签: qt qt4 qpainter


    【解决方案1】:

    不确定您的性能要求,但您可以在屏幕外渲染线条,然后查看图像以查看绘制了哪些像素。这是一个示例,它打印在 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);
    }
    

    【讨论】:

    • 谢谢,但这还不够快。我需要与 matlab 交流我的 Qt GUI。所以发送像素坐标比较好,我现在做的是你建议的,但是太慢了。
    【解决方案2】:

    所覆盖的确切像素在 Qt 程序中甚至不一定是一致的。在QPainter上开启抗锯齿会不一样,画到QGLWidget上会不一样,而且可能会根据程序运行在哪个平台上有所不同,因为Qt有不同的@ 987654323@ 实现不一定产生完全相同的输出。

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

    【讨论】:

    • 是的,我只想要特定绘制操作覆盖的像素,我不需要它对于不同的版本/平台相同,我只想使用Qt提供的可用渲染引擎,并获取特定绘制操作覆盖的像素。但我不认为mzelina的方式是唯一的解决方案,因为我希望(QImage->data)不被QPainter直接访问。
    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2011-06-11
    • 2016-11-01
    • 2022-11-10
    • 2011-05-01
    相关资源
    最近更新 更多