如何获得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()”操作。任何人都可以证明不然或确认,甚至可能写一个简短的代码来做到这一点吗?
答案 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建议的方法来做到这一点。