当前位置: 首页> 最新文章列表> 想做个环形图?用 imagefilledarc 创建环形图像效果的完整步骤分享

想做个环形图?用 imagefilledarc 创建环形图像效果的完整步骤分享

M66 2025-06-27

在 web 开发中,图表展示是用户交互体验的一个重要部分。环形图作为一种常见的图表类型,凭借其简洁而直观的展示效果,广泛应用于数据可视化的场景。如果你想要在 PHP 中生成环形图,那么 imagefilledarc 函数将是你的一个好帮手。下面,我们将通过一系列步骤,教你如何利用 PHP 中的 GD 库来创建环形图效果。

1. 环境准备

首先,我们需要确保你的 PHP 环境已经支持 GD 库,因为 imagefilledarc 是 GD 库的一部分。可以通过以下代码检查 GD 库是否已启用:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'gd_info'</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"GD库已启用"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"GD库未启用"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

如果 GD 库没有启用,你需要安装并启用它,通常在 PHP 配置文件中进行调整,或者在服务器上安装相关扩展。

2. 创建基本的图片画布

使用 GD 库时,第一步通常是创建一个画布。画布可以通过 imagecreatetruecolor() 函数创建,这个函数会返回一个空白的画布对象,我们可以在上面进行各种绘制操作。

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 设置画布的宽度和高度</span></span><span>
</span><span><span class="hljs-variable">$width</span></span><span> = </span><span><span class="hljs-number">400</span></span><span>;
</span><span><span class="hljs-variable">$height</span></span><span> = </span><span><span class="hljs-number">400</span></span><span>;

</span><span><span class="hljs-comment">// 创建画布</span></span><span>
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-variable">$width</span></span><span>, </span><span><span class="hljs-variable">$height</span></span><span>);

</span><span><span class="hljs-comment">// 为背景填充颜色</span></span><span>
</span><span><span class="hljs-variable">$backgroundColor</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>); </span><span><span class="hljs-comment">// 白色</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefill</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$backgroundColor</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. 绘制环形图

接下来,使用 imagefilledarc() 函数来绘制环形图。这个函数可以绘制一个有填充的圆弧,我们通过设置不同的起始和结束角度来制作环形图效果。

imagefilledarc() 函数的参数说明:

<span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-variable">$width</span></span><span>, </span><span><span class="hljs-variable">$height</span></span><span>, </span><span><span class="hljs-variable">$start</span></span><span>, </span><span><span class="hljs-variable">$end</span></span><span>, </span><span><span class="hljs-variable">$color</span></span><span>, </span><span><span class="hljs-variable">$style</span></span><span>);
</span></span>
  • $image: 画布资源

  • $cx, $cy: 圆心坐标

  • $width, $height: 圆的宽度和高度

  • $start, $end: 弧线的起始和结束角度(单位:度)

  • $color: 填充颜色

  • $style: 绘制风格,使用 IMG_ARC_PIE 创建填充的圆弧

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 设置颜色</span></span><span>
</span><span><span class="hljs-variable">$black</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-variable">$blue</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>);
</span><span><span class="hljs-variable">$green</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// 圆心坐标</span></span><span>
</span><span><span class="hljs-variable">$cx</span></span><span> = </span><span><span class="hljs-variable">$width</span></span><span> / </span><span><span class="hljs-number">2</span></span><span>;
</span><span><span class="hljs-variable">$cy</span></span><span> = </span><span><span class="hljs-variable">$height</span></span><span> / </span><span><span class="hljs-number">2</span></span><span>;

</span><span><span class="hljs-comment">// 绘制环形图</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">120</span></span><span>, </span><span><span class="hljs-variable">$blue</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 蓝色区域</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">120</span></span><span>, </span><span><span class="hljs-number">240</span></span><span>, </span><span><span class="hljs-variable">$green</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 绿色区域</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">240</span></span><span>, </span><span><span class="hljs-number">360</span></span><span>, </span><span><span class="hljs-variable">$black</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 黑色区域</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

4. 输出和保存图片

完成绘制后,你可以选择将图片直接显示在网页上,或者将其保存为一个文件。通过 header() 函数将内容类型设置为图片类型,然后使用 imagepng()imagejpeg() 等函数输出图片。

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 设置内容类型为 PNG 图像</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);

</span><span><span class="hljs-comment">// 输出图像到浏览器</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);

</span><span><span class="hljs-comment">// 保存图像到文件</span></span><span>
</span><span><span class="hljs-comment">// imagepng($image, 'donut_chart.png');</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

5. 销毁图片资源

为了节省内存,在生成图片之后,记得销毁图像资源:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

6. 完整代码示例

将所有步骤结合起来,下面是一个完整的 PHP 环形图生成代码示例:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 创建画布</span></span><span>
</span><span><span class="hljs-variable">$width</span></span><span> = </span><span><span class="hljs-number">400</span></span><span>;
</span><span><span class="hljs-variable">$height</span></span><span> = </span><span><span class="hljs-number">400</span></span><span>;
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-variable">$width</span></span><span>, </span><span><span class="hljs-variable">$height</span></span><span>);

</span><span><span class="hljs-comment">// 为背景填充颜色</span></span><span>
</span><span><span class="hljs-variable">$backgroundColor</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>); </span><span><span class="hljs-comment">// 白色</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefill</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$backgroundColor</span></span><span>);

</span><span><span class="hljs-comment">// 设置颜色</span></span><span>
</span><span><span class="hljs-variable">$black</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-variable">$blue</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>);
</span><span><span class="hljs-variable">$green</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// 圆心坐标</span></span><span>
</span><span><span class="hljs-variable">$cx</span></span><span> = </span><span><span class="hljs-variable">$width</span></span><span> / </span><span><span class="hljs-number">2</span></span><span>;
</span><span><span class="hljs-variable">$cy</span></span><span> = </span><span><span class="hljs-variable">$height</span></span><span> / </span><span><span class="hljs-number">2</span></span><span>;

</span><span><span class="hljs-comment">// 绘制环形图</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">120</span></span><span>, </span><span><span class="hljs-variable">$blue</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 蓝色区域</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">120</span></span><span>, </span><span><span class="hljs-number">240</span></span><span>, </span><span><span class="hljs-variable">$green</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 绿色区域</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledarc</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$cx</span></span><span>, </span><span><span class="hljs-variable">$cy</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">240</span></span><span>, </span><span><span class="hljs-number">360</span></span><span>, </span><span><span class="hljs-variable">$black</span></span><span>, IMG_ARC_PIE); </span><span><span class="hljs-comment">// 黑色区域</span></span><span>

</span><span><span class="hljs-comment">// 设置内容类型为 PNG 图像</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);

</span><span><span class="hljs-comment">// 输出图像到浏览器</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);

</span><span><span class="hljs-comment">// 销毁图像资源</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

7. 小结

通过以上步骤,你已经掌握了如何使用 imagefilledarc 函数来绘制一个简单的环形图。可以根据实际需要,调整颜色、角度和尺寸等参数,制作出符合你需求的环形图。在复杂应用中,环形图也可以与动态数据结合,实时更新图表内容,提升用户体验。

希望这篇教程能帮助你在 PHP 项目中实现环形图效果,进一步提升你的数据可视化能力!