使用GD功能改变图像的颜色。由于多次 迭代 ,需要花费大量时间来创建。如下所述脚本粉红色(255,0,255)和近似颜色替换为其他动态颜色。脚本输出是正确的,但提到它需要花费大量时间来创建输出图像。
是否可以减少带有颜色的图像的创建时间 可更改的功能还是可以更改代码的任何部分?
function changeImageColor($oldColorTriplet, $newColorTriplet, $hueError = 0.4){
if (!$this->isImageCreated())
return false;
$oldColorHSL = $this->RGBtoHSL($oldColorTriplet[0], $oldColorTriplet[1], $oldColorTriplet[2]);
$newColorHSL = $this->RGBtoHSL($newColorTriplet[0], $newColorTriplet[1], $newColorTriplet[2]);
$cx = $this->width();
$cy = $this->height();
for ($x = 0; $x < $cx; $x++) {
for ($y = 0; $y < $cy; $y++) {
$pixel = imagecolorsforindex($this->handle, imagecolorat($this->handle, $x, $y));
$currentColorHSL = $this->RGBtoHSL($pixel['red'], $pixel['green'], $pixel['blue']);
if (($currentColorHSL[0] >= $oldColorHSL[0] - $hueError)
&& ($oldColorHSL[0] + $hueError >= $currentColorHSL[0])) {
//$color = $this->HSLtoRGB($newColorHSL[0], $newColorHSL[1], $currentColorHSL[2]);
$color = $newColorTriplet;
$color = imagecolorallocatealpha($this->handle, $color[0], $color[1], $color[2], $pixel['alpha']);
imagesetpixel($this->handle, $x, $y, $color);
}
}
}
return true;
}
function RGBtoHSL( $r, $g, $b ){
$r /= 255;
$g /= 255;
$b /= 255;
$max = max( $r, $g, $b );
$min = min( $r, $g, $b );
$l = ( $max + $min ) / 2;
$d = $max - $min;
if( $d == 0 ){
$h = $s = 0;
} else {
$s = $d / ( 1 - abs( 2 * $l - 1 ) );
switch( $max ){
case $r:
$h = 60 * fmod( ( ( $g - $b ) / $d ), 6 );
if ($b > $g) {
$h += 360;
}
break;
case $g:
$h = 60 * ( ( $b - $r ) / $d + 2 );
break;
case $b:
$h = 60 * ( ( $r - $g ) / $d + 4 );
break;
}
}
return array( round( $h, 2 ), round( $s, 2 ), round( $l, 2 ) );
}
function HSLtoRGB( $h, $s, $l ){
$c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
$x = $c * ( 1 - abs( fmod( ( $h / 60 ), 2 ) - 1 ) );
$m = $l - ( $c / 2 );
if ( $h < 60 ) {
$r = $c;
$g = $x;
$b = 0;
} else if ( $h < 120 ) {
$r = $x;
$g = $c;
$b = 0;
} else if ( $h < 180 ) {
$r = 0;
$g = $c;
$b = $x;
} else if ( $h < 240 ) {
$r = 0;
$g = $x;
$b = $c;
} else if ( $h < 300 ) {
$r = $x;
$g = 0;
$b = $c;
} else {
$r = $c;
$g = 0;
$b = $x;
}
$r = ( $r + $m ) * 255;
$g = ( $g + $m ) * 255;
$b = ( $b + $m ) * 255;
return array( floor( $r ), floor( $g ), floor( $b ) );
}
答案 0 :(得分:0)
我还有其他方法可以减少图像创建时间:
只调用那些像素 替换颜色并仅在这些位置实现上述代码。
意味着假设一个图像,有10,000像素1000像素 rgb(255,0,255)比我保存这1000个像素的位置并在申请时 颜色我只发送这1000个像素来改变颜色。
答案 1 :(得分:0)
我不是PHP + GD的专家,但在我看来,你喜欢在一些HSL颜色的任何一侧带上所有像素并用纯色替换它们 - 如果是这样,你可以用ImageMagick很快地做到这一点用PHP。我将尝试在命令行显示该概念,然后您可以对其进行基准测试,因为ImageMagick安装在大多数Linux发行版上,可用于OSX和Windows。
首先让我们制作一个名为swatch.png
的渐变图像进行测试,其中包含一些粉红色:
convert -size 100x100 gradient:blue-pink gradient:pink-blue -rotate -90 +append swatch.png
现在,让我们看看ImageMagick认为pink
在HSL坐标中的样子:
convert xc:pink -depth 8 -colorspace hsl txt:
# ImageMagick pixel enumeration: 1,1,255,hsl
0,0: (63628,65535,57440) #F8FFE0 hsl(349.524,100%,87.6478%)
因此,这使得Hue组件63628/65535,或349.524 / 360或97%
现在,如果我们采取样本并复制它,然后进入副本并转换为HSL颜色空间,分离H,S&amp; L通道,并删除饱和度和亮度,我们将只有Hue通道当下。如果我们现在让所有低于96%的物品都变成黑色,然后使黑色变得透明,超过98%变成白色,然后使白色透明,我们的图像中只有任何不透明度,色调在96-98%之间,即周围我们的粉红色。如果我们现在用石灰填充图像并将其覆盖在原始图像的顶部,我们将看到我们用石灰绿取代了粉红色的色调。
convert swatch.png \
\( +clone -colorspace hsl -separate -delete 1,2 \
-black-threshold 96% -transparent black \
-white-threshold 98% -transparent white \
-fill lime -colorize 100% \
\) -compose overlay -composite result.png
如果我们将Hue的低端容差扩大到90%:
convert swatch.png \( +clone -colorspace hsl -separate -delete 1,2 -black-threshold 90% -transparent black -white-threshold 98% -transparent white -fill lime -colorize 100% \) -compose overlay -composite result.png
如果我们缩小Hue的上限容差:
convert swatch.png \( +clone -colorspace hsl -separate -delete 1,2 -black-threshold 96.0% -transparent black -white-threshold 97.0% -transparent white -fill red -colorize 100% \) -compose overlay -composite result.png
使用ImageMagick还有其他方法可以做到这一点,但这应该给你一个想法,你可以在执行任何PHP之前在命令行测试它。