性能改进PHP GD调整大小并修剪图像背景,保持正确的比例

时间:2013-02-02 12:00:02

标签: php image image-processing gd image-resizing

我开发了一个图像调整大小&使用PHP GD库修剪类。我使用skibulks image trim script修剪了第一步中的图像背景,并将第二步中的图像缩放到所需的大小(保持原始比例)。

问题:在从imagecopy函数获取新修剪的图像大小后,是否真的有必要执行第一个$this->_trimBackground()作业,以便{{1}重新创建图像使用新的修剪尺寸(并在之后再次调整大小)? ,是否可以将此作业与以下调整大小部分imagecopy合并?

我还不知道其他可能的性能改进吗?欢迎提出各种表现建议!

功能1:

imagecopyresampled

功能2:

/**
 * Resize image file
 * 
 * @param   string $filepath the image filepath
 * @param   integer $width the width to resize
 * @param   integer $height the height to resize
 * @return  (image blob|boolean status)
 * @throws  Asset_Model_Image_Exception
 */
private function _resizeImageByFilepathAndReturn($filepath, $width, $height) {

    list($imageWidth, $imageHeight, $imageType) = getimagesize($filepath);

   switch($imageType) {
    case IMAGETYPE_GIF:
            $gdImage = imagecreatefromgif($filepath);
            break;
      case IMAGETYPE_JPEG:
            $gdImage = imagecreatefromjpeg($filepath);
            break;
      case IMAGETYPE_PNG:
            $gdImage = imagecreatefrompng($filepath);
            break;
      default:
                return false;
   }

   if($box = $this->_trimBackground($gdImage)) {

    $gdTrimmed = imagecreatetruecolor($box['w'], $box['h']);
    imagecopy($gdTrimmed, $gdImage, 0, 0, $box['l'], $box['t'], $box['w'], $box['h']);

    $imageWidth = $box['w'];
    $imageHeight = $box['h'];
    $gdImage = $gdTrimmed;

    unset($gdTrimmed);

   }

   if($imageWidth <= $width && $imageHeight <= $height) {

    $fwidth = $imageWidth;
        $fheight = $imageHeight;

   } else {

        $wscale = $width / $imageWidth;
        $hscale = $height / $imageHeight;
        $scale = min($wscale, $hscale);
        $fwidth = $scale * $imageWidth;
        $fheight = $scale * $imageHeight;

   }

   $gdThumbnail = imagecreatetruecolor($width, $height);

   imagefill($gdThumbnail, 0, 0, 0x00FFFFFF);

   imagecopyresampled($gdThumbnail, $gdImage, ($width - $fwidth) / 2, ($height - $fheight) / 2, 0, 0, $fwidth, $fheight, $imageWidth, $imageHeight);

   ob_start();
   imagejpeg($gdThumbnail, null, 90);
   $image = ob_get_contents();
   ob_end_clean();

   imagedestroy($gdImage);
   imagedestroy($gdThumbnail);

   return $image;

}

1 个答案:

答案 0 :(得分:5)

imagecopy()将$ gdImage的一部分复制到$ gdTrimmed,稍后几行用$ gdTrimmed覆盖$ gdImage。

  

是否真的有必要进行第一次图像复制?

这是你应该问自己的事情。

使用imagedestroy()功能代替unset()可能会大大提高您的效果。这是对imagedestroy()的有用评论:

  

重用图像变量不会清除旧数据的内存!   您必须使用imagedestroy()来清除数据。 (我不知道是否   unset()也可以。)

     

另请注意,内存中的图像数据是原始的,因此不要基于多少   您正在使用的内存基于压缩的原始文件大小   图像(例如jpeg或png)。