PHP

PHP图像操作怎样实现色彩调整

小樊
82
2024-11-05 22:50:46
栏目: 编程语言

在PHP中,可以使用GD库或Imagick扩展来实现图像色彩调整。这里我将向您展示如何使用GD库进行色彩调整。

以下是一个简单的示例,展示了如何使用GD库调整图像的亮度、对比度和饱和度:

<?php
function adjust_image_colors($image, $brightness = 0, $contrast = 0, $saturation = 0)
{
    // 获取原始图像尺寸
    list($width, $height) = getimagesize($image);

    // 根据原始图像类型创建图像资源
    switch (getImageType($image)) {
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif($image);
            break;
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg($image);
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng($image);
            break;
        default:
            return false;
    }

    // 创建一个空图像资源,用于存储调整后的颜色
    $adjusted_image = imagecreatetruecolor($width, $height);

    // 分配内存并将原始图像复制到新的图像资源中
    imagealphablending($adjusted_image, false);
    imagesavealpha($adjusted_image, true);
    imagecopy($adjusted_image, $image, 0, 0, 0, 0, $width, $height, $width, $height);

    // 调整亮度和对比度
    for ($x = 0; $x < $width; $x++) {
        for ($y = 0; $y < $height; $y++) {
            $rgb = imagecolorat($image, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;

            // 调整亮度
            $r = min(255, max(0, $r + $brightness));
            $g = min(255, max(0, $g + $brightness));
            $b = min(255, max(0, $b + $brightness));

            // 调整对比度
            $r = min(255, max(0, ($r - 128) * (1 + $contrast / 127) + 128));
            $g = min(255, max(0, ($g - 128) * (1 + $contrast / 127) + 128));
            $b = min(255, max(0, ($b - 128) * (1 + $contrast / 127) + 128));

            // 调整饱和度
            $hsl = rgb_to_hsl($r, $g, $b);
            $hsl[1] = max(0, min(1, $hsl[1] * (1 + $saturation / 100)));
            $rgb = hsl_to_rgb($hsl);

            imagesetpixel($adjusted_image, $x, $y, $rgb);
        }
    }

    // 保存调整后的图像
    switch (getImageType($image)) {
        case IMAGETYPE_GIF:
            imagegif($adjusted_image, 'adjusted_image.gif');
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($adjusted_image, 'adjusted_image.jpg');
            break;
        case IMAGETYPE_PNG:
            imagepng($adjusted_image, 'adjusted_image.png');
            break;
    }

    // 销毁图像资源
    imagedestroy($image);
    imagedestroy($adjusted_image);

    return 'adjusted_image.jpg'; // 返回调整后的图像文件名
}

function rgb_to_hsl($r, $g, $b)
{
    $r /= 255;
    $g /= 255;
    $b /= 255;

    $max = max($r, $g, $b);
    $min = min($r, $g, $b);
    $delta = $max - $min;

    $l = ($max + $min) / 2;

    if ($delta == 0) {
        $h = 0;
        $s = 0;
    } else {
        if ($l < 0.5) {
            $s = $delta / (max + min);
        } else {
            $s = $delta / (2 - max - min);
        }

        if ($max == $r) {
            $h = ($g - $b) / $delta + (g < b ? 6 : 0);
        } elseif ($max == $g) {
            $h = ($b - $r) / $delta + 2;
        } elseif ($max == $b) {
            $h = ($r - $g) / $delta + 4;
        }

        $h /= 6;
    }

    return [$h, $s, $l];
}

function hsl_to_rgb($hsl)
{
    $h = $hsl[0] * 6;
    $s = $hsl[1];
    $l = $hsl[2];

    $c = (1 - abs(2 * $l - 1)) * $s;
    $x = $c * (1 - abs(($h / 6) % 2 - 1));
    $m = $l - $c / 2;

    $r = 0;
    $g = 0;
    $b = 0;

    if ($h >= 0 && $h < 1) {
        $r = $c;
        $g = $x;
    } elseif ($h >= 2 && $h < 3) {
        $r = $x;
        $g = $c;
    } elseif ($h >= 4 && $h < 5) {
        $g = $c;
        $b = $x;
    } elseif ($h >= 5 && $h < 6) {
        $b = $x;
        $r = $c;
    }

    $r += $m;
    $g += $m;
    $b += $m;

    return [$r * 255, $g * 255, $b * 255];
}

// 使用示例
$input_image = 'input_image.jpg';
$output_image = adjust_image_colors($input_image, 30, 20, 50);
echo "Adjusted image saved as: " . $output_image;
?>

这个示例中的adjust_image_colors函数接受一个图像文件名以及三个可选参数:亮度、对比度和饱和度。函数首先获取图像尺寸并创建一个与原始图像相同大小的空图像资源。然后,它遍历原始图像的每个像素,调整其颜色值,并将结果存储在新图像中。最后,函数将调整后的图像保存为新的文件。

请注意,这个示例仅适用于JPEG和PNG图像。要处理GIF图像,您需要安装GD库的GIF支持扩展(通常在PHP安装过程中默认启用)。

0
看了该问题的人还看了