我正在使用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;
}
发布于 2016-10-15 03:31:54
如果没有其他帮助,可以将图表绘制得更大,然后使用ImageMagick缩小结果图像。这是一个最后的解决方案,它具有明显的额外计算成本。
这是一行示例:
convert chart.png -resize 750×200 chart.jpg
如果原始图像是两倍大(通过简单地将代码中的两个维度都加倍),像这样的大小调整会将四个像素合并为一个,在五个级别上平滑锯齿(0%,25%,50%,75%,100%)。如果您将图像绘制得更大,则可以在绘制线条时关闭抗锯齿功能,因为调整大小将使所有内容变得平滑。
字体和可读性可能会成为一个问题,因此您可能需要绘制两个图像:
调整线条图像的大小后,您必须通过将两个图像重叠为一个图像来组合它们。这也可以使用ImageMagick来完成。
发布于 2016-10-18 19:21:25
如果删除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');
https://stackoverflow.com/questions/39725365
复制相似问题