📜  PHP |想象一下 roundCorners()函数(1)

📅  最后修改于: 2023-12-03 14:45:20.856000             🧑  作者: Mango

PHP - 想象一下 roundCorners()函数

在 Web 开发中,我们常常需要将图片或按钮等元素的边角进行圆角处理。这时候一个 roundCorners() 函数就非常有用了。

下面给出一个 PHP 版本的 roundCorners() 函数的伪代码:

function roundCorners($imagePath, $cornerRadius) {
    // 加载待处理的图片
    $image = loadImage($imagePath);

    // 计算圆角的位置和大小
    $rect = calculateRoundRect($image, $cornerRadius);

    // 创建一个遮罩层
    $mask = createRoundMask($rect, $cornerRadius);

    // 将遮罩层应用到图片上
    applyMask($image, $mask);

    // 输出处理后的图片
    outputImage($image);
}

这个函数实现了以下四个步骤:

  1. 加载待处理的图片;

  2. 根据圆角半径计算出圆角的位置和大小;

  3. 创建一个遮罩层,用于将图片的边角变为透明;

  4. 将遮罩层应用到图片上,生成经过圆角处理的新图像。

接下来分别介绍这四个步骤的具体实现。

加载待处理的图片

要加载一张图片,可以使用 PHP GD 库提供的 imagecreatefromxxx() 函数,例如:

function loadImage($imagePath) {
    $extension = strtolower(pathinfo($imagePath, PATHINFO_EXTENSION));
    switch ($extension) {
        case 'gif':
            return imagecreatefromgif($imagePath);
        case 'jpg':
        case 'jpeg':
            return imagecreatefromjpeg($imagePath);
        case 'png':
            return imagecreatefrompng($imagePath);
        default:
            throw new Exception("Unsupported image format: $extension");
    }
}

这个函数根据图片的扩展名来选择合适的加载函数。如果图片格式不受支持,则抛出一个异常。

计算圆角的位置和大小

有了原始的图像,我们需要计算出边角的位置和大小,具体可以利用 PHP GD 库提供的 imagecopyresampled() 函数,例如:

function calculateRoundRect($image, $cornerRadius) {
    $width = imagesx($image);
    $height = imagesy($image);
    $minSize = min($width, $height);
    if ($cornerRadius < 1 || $minSize < 2 * $cornerRadius) {
        return [
            'x' => 0,
            'y' => 0,
            'width' => $width,
            'height' => $height,
            'radius' => 0,
        ];
    }
    $radius = $cornerRadius * $minSize / 2 / 100;
    $x = $radius;
    $y = $radius;
    $width = $minSize - 2 * $radius;
    $height = $minSize - 2 * $radius;
    return [
        'x' => $x,
        'y' => $y,
        'width' => $width,
        'height' => $height,
        'radius' => $radius,
    ];
}

这个函数计算出图像中心的最大圆形区域,然后根据传入的圆角半径计算新的矩形区域。如果圆角半径小于 1,或者新矩形的宽度或高度小于等于 2 倍的圆角半径,则返回原始的矩形区域。

创建一个遮罩层

有了边角的位置和大小,我们可以创建一个遮罩层来把图片的边角变为透明。具体可以使用 PHP GD 库提供的 imagefilledellipse() 和 imagefilledrectangle() 函数,例如:

function createRoundMask($rect, $cornerRadius) {
    $mask = imagecreatetruecolor($rect['width'], $rect['height']);
    $black = imagecolorallocate($mask, 0, 0, 0);
    $transparent = imagecolorallocatealpha($mask, 0, 0, 0, 127);
    imagecolortransparent($mask, $black);
    imagealphablending($mask, false);
    imagesavealpha($mask, true);
    imagefilledellipse($mask, $rect['radius'], $rect['radius'], $rect['radius'] * 2, $rect['radius'] * 2, $transparent);
    imagefilledellipse($mask, $rect['width'] - $rect['radius'], $rect['radius'], $rect['radius'] * 2, $rect['radius'] * 2, $transparent);
    imagefilledellipse($mask, $rect['radius'], $rect['height'] - $rect['radius'], $rect['radius'] * 2, $rect['radius'] * 2, $transparent);
    imagefilledellipse($mask, $rect['width'] - $rect['radius'], $rect['height'] - $rect['radius'], $rect['radius'] * 2, $rect['radius'] * 2, $transparent);
    imagefilledrectangle($mask, $rect['radius'], 0, $rect['width'] - $rect['radius'], $rect['height'], $transparent);
    imagefilledrectangle($mask, 0, $rect['radius'], $rect['width'], $rect['height'] - $rect['radius'], $transparent);
    return $mask;
}

这个函数创建了一个黑色背景的图像,然后使用透明色画出圆角矩形的边框和四个圆角。最后将黑色变为透明。

将遮罩层应用到图片上

有了遮罩层,我们可以将其应用到原始图像上,得到一个经过圆角处理的新图像。具体可以使用 PHP GD 库提供的 imagecopy() 和 imagecopymerge() 函数,例如:

function applyMask($image, $mask) {
    $width = imagesx($image);
    $height = imagesy($image);
    imagealphablending($image, true);
    imagesavealpha($image, true);
    imagecopy($image, $mask, 0, 0, 0, 0, $width, $height);
    imagedestroy($mask);
}

这个函数将图像和遮罩层进行合成,其中 imagealphablending() 和 imagesavealpha() 设置了图像的透明度,imagecopy() 则是将遮罩层和原始图像进行合成。

输出处理后的图片

最后一步是输出经过圆角处理的新图像。可以利用 PHP GD 库提供的 imagejpeg()、imagepng() 和 imagegif() 函数实现不同格式的输出。

综上所述,roundCorners() 函数可以轻松实现圆角处理的功能,使得 Web 开发变得更加简单和美观。