Экспорт vtkChartXY / vtkPlot как растровое изображение высокого разрешения (JPG или PNG)

Я хочу экспортировать 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 как изображение с высоким разрешением без искажения моего графика, то есть нежелательных расстояний между отрезками?

0

Решение

Это не чистое решение, а скорее хитрость для преодоления проблемы.

Хитрость заключается в том, чтобы, во-первых, экспортировать диаграмму в SVG, а во-вторых, использовать стороннюю библиотеку, чтобы преобразовать ее в желаемое растровое изображение высокого разрешения.

  1. Экспорт изображения SVG

    vtkNew<vtkGL2PSExporter> exp;
    exp->SetRenderWindow(renderWindow.Get());
    exp->SetFileFormatToSVG();
    exp->SetFilePrefix("test");
    exp->Write();
    
  2. Конвертировать 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");
      
    • Qt«s QSvgRenderer

      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): Увидеть эта почта для дополнительной информации.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]