如何减少图像php GD的图像创建时间

时间:2015-10-28 09:28:38

标签: php image imagick

使用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 ) );
    }

2 个答案:

答案 0 :(得分:0)

我还有其他方法可以减少图像创建时间:

  • 上传图片时,我得到的所有像素都接近rgb(255,0,255)并存储在数据库中。
  • 只调用那些像素 替换颜色并仅在这些位置实现上述代码。

  • 意味着假设一个图像,有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

enter image description here

现在,让我们看看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

enter image description here

如果我们将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

enter image description here

如果我们缩小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

enter image description here

使用ImageMagick还有其他方法可以做到这一点,但这应该给你一个想法,你可以在执行任何PHP之前在命令行测试它。