PHP GD库绘制3D扇形图与图片等比例缩放方法
本文将介绍如何利用 PHP 的 GD 扩展库进行图形处理,包括通过多层叠加绘制具有立体效果的 3D 扇形(饼)统计图,以及如何根据预设宽高对现有图片进行保持比例的缩小操作。内容涵盖画布创建、颜色分配、几何绘图API调用及资源释放的标准流程。
使用GD库绘制3D扇形统计图
在纯 PHP 环境中生成图表通常依赖 gd 库。虽然原生接口仅支持 2D 平面绘图,但可以通过视觉欺骗技术——即在同一圆心不同 Y 轴位置多次绘制扇区,形成厚度阴影——来模拟 3D 效果。
第1步:初始化画布与定义调色板
首先创建真彩色画布对象,并为背景及各扇区准备前景色。3D 效果通常包含“顶面”、“侧面/底面”和“高光”三种色系。
<?php
header("content-type","text/html;charset=utf-8");
// 创建画布 (宽100, 高100)
$image = imagecreatetruecolor(100, 100);
// 颜色定义:白色、灰色系(用于侧面)、深色系(用于顶面边缘或文字)
$white = imagecolorallocate($image, 0xff, 0xff, 0xff);
$gray = imagecolorallocate($image, 0xc0, 0xc0, 0xc0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50); // 侧面深蓝
$red = imagecolorallocate($image, 0xff, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00); // 侧面红
?
第2步:填充背景并制作3D厚度
核心逻辑是利用循环从下往上依次绘制椭圆弧。IMG_ARC_PIE 模式用于填充实心扇区。通过改变 Y 坐标偏移量,将原本单层的饼图“压扁”成具有一定深度的圆柱体侧壁。
// 填充白色背景
imagefill($image, 0, 0, $white);
// 利用循环增加厚度(Z轴视觉化)
// 从底部 Y=60 到中间 Y=50,每层向上一像素绘制一次
for($i = 60; $i > 50; $i--)
{
// 左侧面(深蓝)
imagefilledarc($image, 50, $i, 100, 50, -160, 40, $darknavy, IMG_ARC_PIE);
// 中间面(灰)
imagefilledarc($image, 50, $i, 100, 50, 40, 75, $darkgray, IMG_ARC_PIE);
// 右侧面(暗红)
imagefilledarc($image, 50, $i, 100, 50, 75, 200, $darkred, IMG_ARC_PIE);
}
第3步:绘制顶层扇区与添加标注
在顶部 Y=50 的位置再次绘制相同的扇区以覆盖顶部,形成平整的表面,随后使用 imagestring 写入百分比数据以完成统计图。
// 绘制顶部的三个扇区
imagefilledarc($image, 50, 50, 100, 50, -160, 40, $navy, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 40, 75, $gray, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 75, 200, $red, IMG_ARC_PIE);
// 添加文本标签
imagestring($image, 3, 15, 55, "30%", $white); // 左
imagestring($image, 3, 45, 35, "60%", $white); // 中上
imagestring($image, 3, 60, 60, "10%", $white); // 右
生成的视觉效果如下:
利用PHP实现图片等比例缩放
在处理用户上传的图片时,通常需要将其压缩至指定尺寸而不破坏长宽比。以下方案展示了如何构建一个封装函数来完成此任务。
第1步:获取原图参数与计算新尺寸
使用 getimagesize() 获取原始宽高,并根据输入的最大宽度和高度判断横纵构图,进而换算出等比例的另一边尺寸。
<?php
function thumb($filename, $width = 130, $height = 130)
{
// 获取原始图片信息
list($orig_w, $orig_h) = getimagesize($filename);
// 计算等比例缩放后的高/宽
if ($orig_w && ($orig_w < $orig_h)) {
// 纵向图:宽度受限,按宽度比例算高度
$new_height = intval(($height / $orig_h) * $orig_w);
$new_width = $width;
} else {
// 横向图:高度受限,按高度比例算宽度
$new_width = intval(($width / $orig_w) * $orig_h);
$new_height = $height;
}
}
第2步:重采样与导出保存
使用 imagecreatefrompng 读取源文件,通过 imagecopyresampled(双线性插值)进行高质量缩放,避免直接拉伸导致的锯齿模糊。
// 创建新画布并拷贝重采样图像
$new_img = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $orig_w, $orig_h);
// 保存为PNG格式到新文件名
imagepng($new_img, 'test_resized.png');
// 释放内存资源
imagedestroy($new_img);
imagedestroy($src_img);
}
// 执行缩放
thumb('input_image.png');
缩放前后的对比示例如下:
以上就是通过 PHP 的 GD 库实现 3D 扇形统计图绘制及图片智能缩放功能的详细内容,更多关于图像处理与动态报表生成技术的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









