Изображение в SVG-файле теряет резкость при увеличении - PullRequest
0 голосов
/ 29 октября 2018

Я занимаюсь разработкой приложения, использующего фреймворки Qt и Qwt для построения графиков для научного проекта. Приложение должно иметь функциональность для сохранения диаграмм в файле SVG в векторном графическом формате. Вот код, который сохраняет график. (Кстати, этот фрагмент кода не из моего исходного приложения, а из простой тестовой программы, которую я написал для имитации.)

QSvgGenerator generator;
generator.setFileName(QString("sample").append(QString::number(rand() % 200)).append(QString(".svg")));
generator.setSize(ui.graphWidget->size());
generator.setViewBox(ui.graphWidget->rect());
generator.setTitle(QString("Sample graph"));

QPainter painter(&generator);
ui.graphWidget->render(&painter);

На первый взгляд изображение SVG выглядело хорошо и четко. Однако, когда я открываю его с помощью Inkscape и увеличиваю с помощью чрезвычайно больших коэффициентов масштабирования, границы точек на диаграмме рассеяния становятся размытыми. Вот скриншот: screenshot of graph after zooming in inkscape

Обратите внимание, что, хотя границы точек утратили резкость, пометки на графике с левой стороны выглядят так же хорошо, как и на исходном изображении. Чтобы сравнить его с форматом PNG, который является строго растровой графикой, я попытался сохранить файл в формате PNG. Когда я открыл файл PNG и увеличил масштаб, я заметил, что все это ломается при гораздо более низком коэффициенте масштабирования. Это показывает, что я делаю лучше, чем обычная растровая графика. Тем не менее, мне нужно найти какой-то способ, чтобы график выглядел лучше, когда он увеличен. Вот фрагмент кода (снова из примера программы), который строит график рассеяния.

plot = new QwtPlot(QwtText(QString("Sample plot")));
QPen pen(QColor(0, 0, 255));
pen.setWidth(3);
curve = new QwtPlotCurve();
curve->setStyle(QwtPlotCurve::Dots);

curve->setPen(pen);


QVector<QPointF> data;
for (int i = 0; i < 10000; i++) {
    data.append(QPointF((qreal)i, rand() % 10 + (rand() % 10) / 10.0 + (rand() % 10) / 100.0 + (rand() % 10) / 1000.0 + (rand() % 10) / 10000.0));
}

seriesData = new QwtPointSeriesData();
seriesData->setSamples(data);
curve->setData(seriesData);
    curve->attach(plot);

plot->setParent(ui.graphWidget);
plot->setGeometry(QRect(0, 0, 800, 800));
plot->replot();

Могу ли я это исправить или это неизбежно? Спасибо за ваше внимание и время.

...