当前位置: 首页> 最新文章列表> imageopenpolygon() + imagecopymerge() 实现图像合成

imageopenpolygon() + imagecopymerge() 实现图像合成

M66 2025-05-29

在PHP中,图像处理是一个非常实用且强大的功能。通过合理运用GD库中的函数,比如 imageopenpolygon()imagecopymerge(),可以轻松实现复杂的图像合成效果。本文将逐步介绍这两个函数的使用方法,并通过一个简单示例展示它们的实际应用。

一、了解 imageopenpolygon() 函数

imageopenpolygon() 是一个用来在图像上绘制开放式多边形(即首尾不相连的多边形线条)的函数。基本语法如下:

bool imageopenpolygon ( GdImage $image , array $points , int $num_points , int $color )
  • $image:图像资源。

  • $points:一个包含坐标点的数组,如 [x1, y1, x2, y2, ...]

  • $num_points:点的数量。

  • $color:绘制线条的颜色。

注意:与 imagepolygon() 不同,imageopenpolygon() 不会自动连接起点和终点。

二、了解 imagecopymerge() 函数

imagecopymerge() 用来将一幅图像部分合并到另一幅图像上,并可以指定透明度。基本语法如下:

bool imagecopymerge(
    GdImage $dst_image,
    GdImage $src_image,
    int $dst_x, int $dst_y,
    int $src_x, int $src_y,
    int $src_width, int $src_height,
    int $pct
)
  • $dst_image:目标图像资源。

  • $src_image:源图像资源。

  • $dst_x, $dst_y:目标图像上放置源图像的起始点坐标。

  • $src_x, $src_y:源图像要拷贝的起始点。

  • $src_width, $src_height:拷贝的宽度和高度。

  • $pct:合并的透明度(0 = 完全透明,100 = 完全不透明)。

三、实际示例:绘制一个开放多边形并合并到背景图

下面是一个完整的示例,我们将使用 imageopenpolygon() 绘制一个简单的图形,并用 imagecopymerge() 将它合成到一张背景图上:

<?php
// 创建背景图
$background = imagecreatetruecolor(400, 300);
$white = imagecolorallocate($background, 255, 255, 255);
imagefill($background, 0, 0, $white);

// 创建前景图(多边形图)
$polygon = imagecreatetruecolor(200, 200);
$transparent = imagecolorallocatealpha($polygon, 0, 0, 0, 127);
imagefill($polygon, 0, 0, $transparent);
imagesavealpha($polygon, true);

// 定义多边形的点
$points = [
    50, 50,
    150, 50,
    150, 150,
    50, 150
];

// 分配颜色
$red = imagecolorallocate($polygon, 255, 0, 0);

// 绘制开放多边形
imageopenpolygon($polygon, $points, count($points) / 2, $red);

// 合成图像
imagecopymerge($background, $polygon, 100, 50, 0, 0, 200, 200, 70);

// 输出图像到浏览器
header('Content-Type: image/png');
imagepng($background);

// 释放资源
imagedestroy($background);
imagedestroy($polygon);
?>

在这个例子中,我们首先创建了一张白色背景的图像,然后创建一张透明背景的前景图,使用 imageopenpolygon() 在前景图上绘制了一个红色开放式方形轮廓,最后通过 imagecopymerge() 将这个前景图以70%透明度合并到了背景图上。

如果你希望将最终结果保存为文件而不是输出到浏览器,只需要将 imagepng($background); 替换为:

imagepng($background, '/path/to/your/folder/merged_image.png');

当然,这里 /path/to/your/folder/ 路径可以换成你自己的服务器地址,比如:

imagepng($background, 'https://m66.net/uploads/merged_image.png');

四、总结

通过 imageopenpolygon()imagecopymerge() 的组合使用,我们可以方便地绘制各种开放式图形,并灵活地将它们融合到任何背景图上,实现丰富的视觉效果。这种技术可以广泛应用于头像合成、水印制作、动态图形处理等场景。