You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP动态图片圆角实现及IP文本居中问题求助

PHP动态图片圆角与文本居中解决方案

一、动态图片添加圆角

用imagefilledpolygon实现圆角效果差,是因为多边形无法精准匹配圆弧曲线。推荐两种更可靠的GD库实现方案:

方案1:直接绘制圆角画布合成原图

思路:先创建带透明圆角的画布,再将原图复制到该画布上,保留圆角区域像素。

function addImageCorner($srcPath, $cornerRadius) {
    // 根据图片类型选择对应创建函数,png用imagecreatefrompng
    $src = imagecreatefromjpeg($srcPath);
    $srcW = imagesx($src);
    $srcH = imagesy($src);

    // 创建带透明通道的目标画布
    $dst = imagecreatetruecolor($srcW, $srcH);
    imagesavealpha($dst, true);
    $transparent = imagecolorallocatealpha($dst, 0, 0, 0, 127);
    imagefill($dst, 0, 0, $transparent);

    // 临时填充色(后续会被原图覆盖并设为透明)
    $fillColor = imagecolorallocate($dst, 255, 255, 255);

    // 绘制四个圆角扇形
    imagefilledarc($dst, $cornerRadius, $cornerRadius, $cornerRadius*2, $cornerRadius*2, 180, 270, $fillColor, IMG_ARC_PIE);
    imagefilledarc($dst, $srcW-$cornerRadius, $cornerRadius, $cornerRadius*2, $cornerRadius*2, 270, 360, $fillColor, IMG_ARC_PIE);
    imagefilledarc($dst, $srcW-$cornerRadius, $srcH-$cornerRadius, $cornerRadius*2, $cornerRadius*2, 0, 90, $fillColor, IMG_ARC_PIE);
    imagefilledarc($dst, $cornerRadius, $srcH-$cornerRadius, $cornerRadius*2, $cornerRadius*2, 90, 180, $fillColor, IMG_ARC_PIE);

    // 填充圆角之间的矩形区域
    imagefilledrectangle($dst, $cornerRadius, 0, $srcW-$cornerRadius, $srcH, $fillColor);
    imagefilledrectangle($dst, 0, $cornerRadius, $srcW, $srcH-$cornerRadius, $fillColor);

    // 合并原图与圆角画布,将填充色设为透明
    imagecopy($dst, $src, 0, 0, 0, 0, $srcW, $srcH);
    imagecolortransparent($dst, $fillColor);

    // 输出图片
    header('Content-Type: image/png');
    imagepng($dst);

    // 释放资源
    imagedestroy($src);
    imagedestroy($dst);
}

// 调用示例:第二个参数为圆角半径
addImageCorner('your-image.jpg', 20);

方案2:遮罩层裁剪(适配复杂形状)

提前制作一张PNG格式的圆角遮罩(透明背景,白色圆角区域),通过合并遮罩实现裁剪效果:

function maskImageWithCorner($srcPath, $maskPath) {
    $src = imagecreatefromjpeg($srcPath);
    $mask = imagecreatefrompng($maskPath);
    $srcW = imagesx($src);
    $srcH = imagesy($src);

    $dst = imagecreatetruecolor($srcW, $srcH);
    imagesavealpha($dst, true);
    $transparent = imagecolorallocatealpha($dst, 0, 0, 0, 127);
    imagefill($dst, 0, 0, $transparent);

    // 复制原图并应用遮罩
    imagecopy($dst, $src, 0, 0, 0, 0, $srcW, $srcH);
    imagecopymerge($dst, $mask, 0, 0, 0, 0, $srcW, $srcH, 100);

    header('Content-Type: image/png');
    imagepng($dst);

    imagedestroy($src);
    imagedestroy($mask);
    imagedestroy($dst);
}

二、IP文本居中显示

核心是通过imagettfbbox获取文本宽高,再结合图片尺寸计算居中坐标(注意文本基线的偏移调整):

function drawCenteredIP($image, $ipText, $fontPath, $fontSize, $textColor) {
    $imgW = imagesx($image);
    $imgH = imagesy($image);

    // 获取文本边界盒,计算宽高
    $textBox = imagettfbbox($fontSize, 0, $fontPath, $ipText);
    $textW = $textBox[2] - $textBox[0];
    $textH = $textBox[1] - $textBox[7];

    // 计算居中坐标:Y轴需加上文本高度抵消基线偏移
    $x = ($imgW - $textW) / 2;
    $y = ($imgH + $textH) / 2;

    // 绘制文本
    imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $ipText);
}

// 调用示例
$img = imagecreatefromjpeg('your-image.jpg');
$white = imagecolorallocate($img, 255, 255, 255);
// 确保字体文件路径正确,比如arial.ttf需放在服务器可访问目录
drawCenteredIP($img, '192.168.1.1', 'arial.ttf', 16, $white);

header('Content-Type: image/jpeg');
imagejpeg($img);
imagedestroy($img);

注意事项

  • 处理PNG图片时必须开启imagesavealpha以保留透明效果。
  • 圆角半径不能超过图片宽/高的一半,否则会出现显示异常。
  • 字体文件需确保服务器有权限读取,可使用系统内置字体或自定义字体文件。

内容的提问来源于stack exchange,提问作者MASTER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:40:27