Я хочу экспортировать 2D-график (vtkChartXY
) как растровое изображение высокого разрешения (JPG
или же PNG
). Я могу экспортировать изображение с разрешением экрана:
Но когда я пытаюсь увеличить разрешение с помощью vtkWindowToImageFilter::SetMagnification(10)
Я получаю следующее искаженное изображение:
Текст просто отлично, но между отрезками линии есть нежелательные интервалы.
Я использовал следующий код для генерации графика:
// Construct a random 2D chart
vtkNew<vtkContextView> pView;
vtkNew<vtkChartXY> pChart;
vtkPlot *pPlot = pChart->AddPlot(vtkChart::LINE);
vtkNew<vtkTable> pTable;
vtkNew<vtkDoubleArray> pX, pY;
pX->SetName("x");
pY->SetName("y");
for (int i = 0; i < 100; ++i)
{
pX->InsertNextTuple1(i);
pY->InsertNextTuple1(std::rand());
}
pTable->AddColumn(pX.Get());
pTable->AddColumn(pY.Get());
pPlot->SetInputData(pTable.Get(), "x", "y");
pView->GetScene()->AddItem(pChart.Get());
И следующий код для экспорта графика в JPEG
:
// Export the image to JPG
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(pView->GetRenderer());
renderWindow->SetSize(300, 300);
renderWindow->OffScreenRenderingOn();
renderWindow->Render();
vtkNew<vtkWindowToImageFilter> windowToImageFilter;
windowToImageFilter->SetInput(renderWindow.Get());
// windowToImageFilter->SetMagnification(10); // uncomment this line to obtain the distorted image
vtkNew<vtkJPEGWriter> writer;
writer->SetFileName("test.jpg");
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();
Если это имеет значение, я использую VTK 7.1 на Ubuntu 16.04.
Вопрос: Как я могу экспортировать vtkChartXY
как изображение с высоким разрешением без искажения моего графика, то есть нежелательных расстояний между отрезками?
Это не чистое решение, а скорее хитрость для преодоления проблемы.
Хитрость заключается в том, чтобы, во-первых, экспортировать диаграмму в SVG, а во-вторых, использовать стороннюю библиотеку, чтобы преобразовать ее в желаемое растровое изображение высокого разрешения.
Экспорт изображения SVG
vtkNew<vtkGL2PSExporter> exp;
exp->SetRenderWindow(renderWindow.Get());
exp->SetFileFormatToSVG();
exp->SetFilePrefix("test");
exp->Write();
Конвертировать SVG в растровое изображение высокого разрешения (например, PNG)
Несколько библиотек могут выполнить это преобразование, например:
Inkscape: можно использовать следующий метод командной строки для преобразования SVG-файла в png-файл с разрешением 300 точек на дюйм:
inkscape test.svg -e test.png -d 300
Который может быть выполнен из C ++ кросс-платформенным способом, используя Qt«s QProcess
учебный класс:
QProcess p;
p.startDetached("inkscape test.svg -e test.png -d 300");
QSvgRenderer renderer (QLatin1String("test.svg"));
const QSize imageSize(4*renderer.defaultSize()); // four times screen resolution
QImage image(imageSize, QImage::Format_ARGB32);
image.fill(Qt::transparent);
QPainter painter;
painter.begin(&image);
renderer.render(&painter, QRectF(QPointF(), QSizeF(imageSize)));
painter.end();
image.save("test.png");
Обратите внимание, что эта реализация может не хватает поддержки некоторых важных атрибутов, таких как baseline-shift
а также dy
. Следовательно, лучшие результаты могут быть получены путем преобразования текста в пути при экспорте в SVG следующим образом:
exp->TextAsPathOn();
Magick ++ (C ++ API ImageMagick): Увидеть эта почта для дополнительной информации.
Других решений пока нет …