Есть отличный ответ о том, как изменить HUE изображения с использованием библиотеки PHP-GD. Но мне нужно знать, как изменить Насыщение изображения с использованием PHP-GD. Вот копия кода из ответа, который успешно меняет оттенок изображения.
function imagehue(&$image, $angle) {
if($angle % 360 == 0) return;
$width = imagesx($image);
$height = imagesy($image);
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;
$alpha = ($rgb & 0x7F000000) >> 24;
list($h, $s, $l) = rgb2hsl($r, $g, $b);
$h += $angle / 360;
if($h > 1) $h--;
list($r, $g, $b) = hsl2rgb($h, $s, $l);
imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
}
Если вам нужно взглянуть на код вспомогательных функций rgb2hsl
а также hsl2rgb
пожалуйста, проверьте оригинальный ответ. поскольку Hue
является одним из параметров HSL, я думал, что мог бы как-то изменить функцию, чтобы получить рабочее решение для насыщения. Несмотря на ограниченные навыки php, мне пришлось попробовать, но это не сработало и дало странные результаты. Вот модификация, которую я пробую.
ИЗМЕНЕННЫЙ КОД: ОБНОВЛЕНО как предложено @mark
function imageSaturation(&$image, $saturationPercentage) {
$width = imagesx($image);
$height = imagesy($image);
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;
$alpha = ($rgb & 0x7F000000) >> 24;
list($h, $s, $l) = rgb2hsl($r, $g, $b);
$s = $s * (100 + $saturationPercentage ) /100;
if($s > 1) $s = 1;
list($r, $g, $b) = hsl2rgb($h, $s, $l);
imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
}
header('Content-type: image/png');
$image = imagecreatefrompng('rgb.png');
imageSaturation($image, -80);//bring down current image saturation to 80%
imagepng($image);
ОБНОВЛЕНИЕ УСИЛИЯ :
@Dai указал мне, что эти строки помогают создать цветовой код отдельного пикселя RGB. Значит, эта часть может остаться без изменений?
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
В следующей строке мы просто конвертируем значения RGB в HSL с помощью rgb2hsl($r, $g, $b);
и назначив его list($h, $s, $l)
, Дело в том, что я застрял на данный момент, эти строки.
$s += $saturationPercentage / 100;
if($s > 1) $s--;
Я понимаю синтаксис, но не уверен, как я справлюсь с этим или если они даже требуются. Если бы не ответ полезные советы / предложения, было бы здорово. Я пытаюсь код на это изображение снизить насыщенность со 100% до 80%, но я получаю это изображение в результате.
Я думаю, что вам нужно что-то вроде
$s=$s * (100+$saturationPercentage)/100
иначе вы просто добавляете константу к каждому значению, а не в процентах от существующего значения.
Кроме того, если вы уменьшаете 1, если ваша новая насыщенность превышает 1, вам, вероятно, будет лучше установить ее на 1,0, то есть полностью насыщенную, например так:
if($s>1)$s=1
в противном случае, скажем, что полученное насыщение равно 1,3 (т.е. очень, очень насыщено), вы сделаете это в 0.3
то есть очень ненасыщенный, вместо 1,0 (полностью насыщенный).
Так что если $s
0,7, и вы добавите 10%, вы получите
$s = 0.7 * (100 + 10)/100
$s = 0.7 * 1.1
$s = 0.77
Других решений пока нет …