Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一些图像/GD问题:裁剪、设置颜色和透明度_Php_Gd - Fatal编程技术网

Php 一些图像/GD问题:裁剪、设置颜色和透明度

Php 一些图像/GD问题:裁剪、设置颜色和透明度,php,gd,Php,Gd,我在Ubuntu机器(PHP5.5.9)上编写了一些使用GD的PHP代码,并将其转移到使用amazon Linux(PHP5.5.31)的amazon EC2上,我从相同的输入数据文件(我只使用imagecreatefromstring();$data包含JPEG文件的内容)中得到了完全不同的结果 在我更换机器之前,它会将白色变为透明。它不再带来这种变化 它过去常常完美地裁剪图形。现在它在左边留下一点白色,在右边剪掉一点图像 左边有一条细黑线 我甚至无法使用imagecolorset()使图像改

我在Ubuntu机器(PHP5.5.9)上编写了一些使用GD的PHP代码,并将其转移到使用amazon Linux(PHP5.5.31)的amazon EC2上,我从相同的输入数据文件(我只使用
imagecreatefromstring()
$data
包含JPEG文件的内容)中得到了完全不同的结果

  • 在我更换机器之前,它会将白色变为透明。它不再带来这种变化
  • 它过去常常完美地裁剪图形。现在它在左边留下一点白色,在右边剪掉一点图像
  • 左边有一条细黑线
  • 我甚至无法使用
    imagecolorset()
    使图像改变颜色
  • 代码如下:

    if ($isFileString) {
        $src2 = imagecreatefromstring($data);
    } else {
        $src2 = imagecreatefromjpeg($data);
    }
    
    // This was an attempt to get it to recognize transparent.
    if (!unlink ("../drive/sigs/tmp.png"))
        die("Failed to delete tmp.png");
    
    imagepng($src2, "../drive/sigs/tmp.png");
    imagedestroy($src2);
    $src = imagecreatefrompng("../drive/sigs/tmp.png");
    
    imagealphablending($src, false);
    imagesavealpha($src, true);
    
    for ($i=0; $i< 1024; $i++) {
        echo $i;
        echo print_r(imagecolorsforindex($src, $i));
        imagecolorset($src, $i, 255, 255, 255,255);
        echo print_r(imagecolorsforindex($src, $i));
        echo "<BR>";
    }
    
    $src = imagecropauto($src, IMG_CROP_WHITE);
    $white = imagecolorallocate($src, 255, 255, 255);
    imagecolortransparent($src, $white);
    $src = imagerotate($src, -90, 0);
    
    EDIT2

    更多信息:我检查了gd版本(
    php-I | grep-I gd
    )。我很惊讶地看到带有GD版本2.1.1-dev的Ubuntu盒和带有“捆绑(2.1.0兼容)”的EC2盒。我是GD新手,所以我更倾向于相信这是我的错,而不是亚马逊提供了一个糟糕的GD版本

    EDIT3

    • 这似乎不是内存问题。
      memory\u get\u peak\u usage()
      报告的内存约为35MB

    • gd_info()
      报告的唯一区别是版本号


    该版本的GD似乎存在一些问题。这并不完美,但这是我们最终确定的代码:

        if ($isFileString) {
            $im1 = imagecreatefromstring($data);
        } else {
            $im1 = imagecreatefromjpeg($data);
        }
        $tmp_file = $this->tmp_dir . md5(time() . mt_rand());
        imagepng($im1, $tmp_file);
        imagedestroy($im1);
    
        // rotate, pre-resize and resample the source image
        $im2 = imagecreatefrompng($tmp_file);
        unlink($tmp_file);
        if (imagesy($im2) > imagesx($im2))
            $im2 = imagerotate($im2, $this->rotate, 0);
        $width = imagesx($im2);
        $height = imagesy($im2);
        $percent = ($this->standard_width * 2) / $width;
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        $im = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($im, $im2, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    
        // create a transparent image with a size like $im image
        $im3 = imagecreatetruecolor($newWidth, $newHeight);
        imagesavealpha($im3, TRUE);
        imagefill($im3, 0, 0, imagecolorallocatealpha($im3, 0, 0, 0, 127));
    
        // find non-white-ish pixels on $im and copy them to $dst
        $sizeX = $newWidth;
        $sizeY = $newHeight;
        $startX = $startY = 100000;
        $finishX = $finishY = 0;
        for ($x = 1; $x < $sizeX - 1; $x++) {
            for ($y = 1; $y < $sizeY - 1; $y++) {
                $rgb = imagecolorat($im, $x, $y);
                $colors = imagecolorsforindex($im, $rgb);
                $r = $colors['red'];
                $g = $colors['green'];
                $b = $colors['blue'];
                if ($r < $this->redLimit && $g < $this->greenLimit && $b < $this->blueLimit) {
                    imagesetpixel($im3, $x, $y, $rgb);
                    if ($startX > $x) {
                        $startX = $x;
                    }
                    if ($startY > $y) {
                        $startY = $y;
                    }
                    if ($finishX < $x)
                        $finishX = $x;
                    if ($finishY < $y)
                        $finishY = $y;
                }
            }
        }
    
        // final resize
        $width = $finishX - $startX + 1;
        $height = $finishY - $startY + 1;
        $percent = $this->standard_width / $width;
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        $im4 = imagecreatetruecolor($newWidth, $newHeight);
        imagesavealpha($im4, TRUE);
        imagefill($im4, 0, 0, imagecolorallocatealpha($im4, 0, 0, 0, 127));
        imagecopyresampled($im4, $im3, 0, 0, $startX, $startY, $newWidth, $newHeight, $width, $height);
    
        // returning image
        ob_start();
        imagepng($im4);
        $image_data = ob_get_contents();
        ob_end_clean();
        return $image_data;
    
    if($isFileString){
    $im1=imagecreatefromstring($data);
    }否则{
    $im1=imagecreatefromjpeg($data);
    }
    $tmp_file=$this->tmp_dir。md5(time().mt_rand());
    imagepng($im1,$tmp_文件);
    国际货币基金组织(1美元);
    //对源图像进行旋转、预调整大小和重采样
    $im2=imagecreatefrompng($tmp_文件);
    取消链接($tmp_文件);
    if(imagesy($im2)>imagesx($im2))
    $im2=imagerotate($im2,$this->rotate,0);
    $width=imagesx($im2);
    $height=imagesy($im2);
    $percent=($this->standard_width*2)/$width;
    $newWidth=$width*$percent;
    $newHeight=$height*$percent;
    $im=ImageCreateTureColor($newWidth,$newHeight);
    imagecopyresampled($im、$im2、0、0、0、0、$newWidth、$newHeight、$width、$height);
    //创建一个大小类似$im image的透明图像
    $im3=ImageCreateTureColor($newWidth,$newHeight);
    imagesavealpha($im3,TRUE);
    imagefill($im3,0,0,imagecolorallocatealpha($im3,0,0,0127));
    //在$im上查找非白色像素并将其复制到$dst
    $sizeX=$newWidth;
    $sizeY=$newHeight;
    $startX=$startY=100000;
    $finishX=$finishY=0;
    对于($x=1;$x<$sizeX-1;$x++){
    对于($y=1;$y<$sizeY-1;$y++){
    $rgb=imagecolorat($im,$x,$y);
    $colors=imagecolorsforindex($im,$rgb);
    $r=$colors['red'];
    $g=$colors['green'];
    $b=$colors['blue'];
    如果($r<$this->redLimit&&$g<$this->greenLimit&&$b<$this->blueLimit){
    imagesetpixel($im3,$x,$y,$rgb);
    如果($startX>$x){
    $startX=$x;
    }
    如果($startY>$y){
    $startY=$y;
    }
    如果($finishX<$x)
    $finishX=$x;
    如果($finishY<$y)
    $finishY=$y;
    }
    }
    }
    //最终调整大小
    $width=$finishX-$startX+1;
    $height=$finishY-$startY+1;
    $percent=$this->standard_width/$width;
    $newWidth=$width*$percent;
    $newHeight=$height*$percent;
    $im4=ImageCreateTureColor($newWidth,$newHeight);
    imagesavealpha($im4,TRUE);
    imagefill($im4,0,0,imagecolorallocatealpha($im4,0,0,0127));
    imagecopyresampled($im4、$im3、0、0、$startX、$startY、$newWidth、$newHeight、$width、$height);
    //返回图像
    ob_start();
    图像PNG(每平方米4美元);
    $image_data=ob_get_contents();
    ob_end_clean();
    返回$image\u数据;
    
        if ($isFileString) {
            $im1 = imagecreatefromstring($data);
        } else {
            $im1 = imagecreatefromjpeg($data);
        }
        $tmp_file = $this->tmp_dir . md5(time() . mt_rand());
        imagepng($im1, $tmp_file);
        imagedestroy($im1);
    
        // rotate, pre-resize and resample the source image
        $im2 = imagecreatefrompng($tmp_file);
        unlink($tmp_file);
        if (imagesy($im2) > imagesx($im2))
            $im2 = imagerotate($im2, $this->rotate, 0);
        $width = imagesx($im2);
        $height = imagesy($im2);
        $percent = ($this->standard_width * 2) / $width;
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        $im = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($im, $im2, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    
        // create a transparent image with a size like $im image
        $im3 = imagecreatetruecolor($newWidth, $newHeight);
        imagesavealpha($im3, TRUE);
        imagefill($im3, 0, 0, imagecolorallocatealpha($im3, 0, 0, 0, 127));
    
        // find non-white-ish pixels on $im and copy them to $dst
        $sizeX = $newWidth;
        $sizeY = $newHeight;
        $startX = $startY = 100000;
        $finishX = $finishY = 0;
        for ($x = 1; $x < $sizeX - 1; $x++) {
            for ($y = 1; $y < $sizeY - 1; $y++) {
                $rgb = imagecolorat($im, $x, $y);
                $colors = imagecolorsforindex($im, $rgb);
                $r = $colors['red'];
                $g = $colors['green'];
                $b = $colors['blue'];
                if ($r < $this->redLimit && $g < $this->greenLimit && $b < $this->blueLimit) {
                    imagesetpixel($im3, $x, $y, $rgb);
                    if ($startX > $x) {
                        $startX = $x;
                    }
                    if ($startY > $y) {
                        $startY = $y;
                    }
                    if ($finishX < $x)
                        $finishX = $x;
                    if ($finishY < $y)
                        $finishY = $y;
                }
            }
        }
    
        // final resize
        $width = $finishX - $startX + 1;
        $height = $finishY - $startY + 1;
        $percent = $this->standard_width / $width;
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        $im4 = imagecreatetruecolor($newWidth, $newHeight);
        imagesavealpha($im4, TRUE);
        imagefill($im4, 0, 0, imagecolorallocatealpha($im4, 0, 0, 0, 127));
        imagecopyresampled($im4, $im3, 0, 0, $startX, $startY, $newWidth, $newHeight, $width, $height);
    
        // returning image
        ob_start();
        imagepng($im4);
        $image_data = ob_get_contents();
        ob_end_clean();
        return $image_data;