PChart линейная диаграмма качества изображения

Я использую PChart для создания линейных диаграмм. Все идет хорошо, кроме качества реальных линий.

Конечно, сглаживание не выключен и даже явно включен.

Вот пример реального изображения, которое выглядит довольно уродливо со всеми этими шагами.

введите описание изображения здесь

Есть ли способ сделать линии нарисованными плавнее, не наступая?

Используемый код:

public function linearTwoAxis($data, $fileName, $startColor = 0)
{
$pData = new \pData();

$i = 0;
foreach ($data as $key => $row)
{
$serie = $this->translator->trans("pages.reportDefault.$key");
$pData->addPoints($row, $serie);
$pData->setSerieOnAxis($serie, $i);
$pData->setSerieWeight($serie, 1);
$pData->setAxisName($i, $serie);
$pData->setPalette($serie, $this->colors[$startColor++]);
$pData->setAxisDisplay($i, AXIS_FORMAT_METRIC);
$i++;
}
$monthNames = array_keys($row);

$pData->setAxisPosition(1, AXIS_POSITION_RIGHT);
$pData->addPoints($monthNames, "Labels");
$pData->setAbscissa("Labels");

$pChart = new \pImage(750, 200, $pData);

$pChart->setFontProperties(array(
"FontName" => $this->fonts_dir . "arial.ttf",
"FontSize" => 8)
);

$pChart->setGraphArea(50, 10, 700, 150);
$pChart->Antialias = TRUE;
$pChart->drawScale(["Mode"  => SCALE_MODE_START0]);
$pChart->drawLineChart();
$pChart->drawLegend(325,180,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE,"Alpha" => 0));

$pChart->render($this->target_dir . $fileName);

return $this->target_dirname . $fileName;
}

15

Решение

Если больше ничего не помогает нарисовать диаграмму намного больше, а затем уменьшить полученное изображение с помощью ImageMagick. Это последнее средство, которое требует дополнительных вычислительных затрат.

Вот пример строки:

convert chart.png -resize 750×200 chart.jpg

Если исходное изображение будет в два раза больше (просто удваивая оба измерения, которые есть в вашем коде), изменение размера, как это, приведет к сжатию четырех пикселей в один, сгладив неровности на пяти уровнях (0%, 25%, 50%, 75%, 100%). Если вы рисуете изображение еще больше, вы можете отключить сглаживание при рисовании линий, потому что изменение размера все равно сгладит все.

Шрифты и удобочитаемость могут стать проблемой, поэтому, возможно, вы захотите нарисовать два изображения:

  • только линии в большем масштабе;
  • остальные легенды / правители и тому подобное в оригинальном масштабе.

Изменив размер изображения линии, вы должны объединить оба изображения, накладывая их на одно изображение. Это также можно сделать с помощью ImageMagick.

4

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

Если вы удалите setSerieWeight, он произведет намного лучшее сглаживание. Например.

<?php

require_once "class/pDraw.class.php"; require_once "class/pImage.class.php"; require_once "class/pData.class.php";

$pData = new \pData();

$data = array(array(0,100),array(100,200),array(200,500));$i = 0;
foreach ($data as $key => $row)
{
$serie = 'test';
$pData->addPoints($row, $serie);
$pData->setSerieOnAxis($serie, $i);

$pData->setAxisName($i, $serie);
$pData->setPalette($serie,  array("R"=>74,"G"=>42,"B"=>112,"Alpha"=>100));
$pData->setAxisDisplay($i, AXIS_FORMAT_METRIC);
$i++;
}
$monthNames = array_keys($row);$pChart = new \pImage(750, 200, $pData);

$pChart->setFontProperties(array(
"FontName" =>  "arial.ttf",
"FontSize" => 8)
);

$pChart->setGraphArea(50, 10, 700, 150);
$pChart->Antialias = TRUE;
$pChart->drawScale(["Mode"  => SCALE_MODE_START0]);
$pChart->drawLineChart();
$pChart->drawLegend(325,180,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE,"Alpha" => 0));

$pChart->render('test.png');

введите описание изображения здесь

2

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