2009-06-16 86 views
7

我已经编码的裁剪图像以给定的纵横比和最后然后调整其大小并将其输出为JPG的函数:PHP/GD - 裁剪和调整图像尺寸

<?php 

function Image($image, $crop = null, $size = null) 
{ 
    $image = ImageCreateFromString(file_get_contents($image)); 

    if (is_resource($image) === true) 
    { 
     $x = 0; 
     $y = 0; 
     $width = imagesx($image); 
     $height = imagesy($image); 

     /* 
     CROP (Aspect Ratio) Section 
     */ 

     if (is_null($crop) === true) 
     { 
      $crop = array($width, $height); 
     } 

     else 
     { 
      $crop = array_filter(explode(':', $crop)); 

      if (empty($crop) === true) 
      { 
       $crop = array($width, $height); 
      } 

      else 
      { 
       if ((empty($crop[0]) === true) || (is_numeric($crop[0]) === false)) 
       { 
        $crop[0] = $crop[1]; 
       } 

       else if ((empty($crop[1]) === true) || (is_numeric($crop[1]) === false)) 
       { 
        $crop[1] = $crop[0]; 
       } 
      } 

      $ratio = array 
      (
       0 => $width/$height, 
       1 => $crop[0]/$crop[1], 
      ); 

      if ($ratio[0] > $ratio[1]) 
      { 
       $width = $height * $ratio[1]; 
       $x = (imagesx($image) - $width)/2; 
      } 

      else if ($ratio[0] < $ratio[1]) 
      { 
       $height = $width/$ratio[1]; 
       $y = (imagesy($image) - $height)/2; 
      } 

      /* 
      How can I skip (join) this operation 
      with the one in the Resize Section? 
      */ 

      $result = ImageCreateTrueColor($width, $height); 

      if (is_resource($result) === true) 
      { 
       ImageSaveAlpha($result, true); 
       ImageAlphaBlending($result, false); 
       ImageFill($result, 0, 0, ImageColorAllocateAlpha($result, 255, 255, 255, 127)); 

       ImageCopyResampled($result, $image, 0, 0, $x, $y, $width, $height, $width, $height); 

       $image = $result; 
      } 
     } 

     /* 
     Resize Section 
     */ 

     if (is_null($size) === true) 
     { 
      $size = array(imagesx($image), imagesy($image)); 
     } 

     else 
     { 
      $size = array_filter(explode('x', $size)); 

      if (empty($size) === true) 
      { 
       $size = array(imagesx($image), imagesy($image)); 
      } 

      else 
      { 
       if ((empty($size[0]) === true) || (is_numeric($size[0]) === false)) 
       { 
        $size[0] = round($size[1] * imagesx($image)/imagesy($image)); 
       } 

       else if ((empty($size[1]) === true) || (is_numeric($size[1]) === false)) 
       { 
        $size[1] = round($size[0] * imagesy($image)/imagesx($image)); 
       } 
      } 
     } 

     $result = ImageCreateTrueColor($size[0], $size[1]); 

     if (is_resource($result) === true) 
     { 
      ImageSaveAlpha($result, true); 
      ImageAlphaBlending($result, true); 
      ImageFill($result, 0, 0, ImageColorAllocate($result, 255, 255, 255)); 
      ImageCopyResampled($result, $image, 0, 0, 0, 0, $size[0], $size[1], imagesx($image), imagesy($image)); 

      header('Content-Type: image/jpeg'); 

      ImageInterlace($result, true); 
      ImageJPEG($result, null, 90); 
     } 
    } 

    return false; 
} 

?> 

功能按预期方式工作,但我正在创建一个不需要的GD图像资源,我该如何解决它?我试过加入这两个电话,但我必须做一些错误的计算。

<?php 

/* 
Usage Examples 
*/ 

Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '1:1', '600x'); 
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '2:1', '600x'); 
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '2:', '250x300'); 

?> 

任何帮助,非常感谢,谢谢。

回答

12

您将不得不修改您的调整大小代码不基于裁剪图像开始。由于您想要一次完成裁剪和调整大小,因此需要单独计算。

<?php 
function Image($image, $crop = ':', $size = null) { 

    $image = ImageCreateFromString(file_get_contents($image)); 

    if (is_resource($image)) { 

     $x = 0; 
     $y = 0; 
     $width = imagesx($image); 
     $height = imagesy($image); 

     // CROP (Aspect Ratio) Section 
     $crop = array_filter(explode(':', $crop)); 

     if (empty($crop)) { 

      $crop = [$width, $height]; 

     } else { 

      $crop[0] = $crop[0] ?: $crop[1]; 
      $crop[1] = $crop[1] ?: $crop[0]; 

     } 

     $ratio = [$width/$height, $crop[0]/$crop[1]]; 

     if ($ratio[0] > $ratio[1]) { 

      $width = $height * $ratio[1]; 
      $x = (imagesx($image) - $width)/2; 

     } else { 

      $height = $width/$ratio[1]; 
      $y = (imagesy($image) - $height)/2; 

     } 


     // Resize Section  
     if (is_null($size)) { 

      $size = [$width, $height]; 

     } else { 

      $size = array_filter(explode('x', $size)); 

      if (empty($size)) { 

       $size = [imagesx($image), imagesy($image)]; 

      } else { 

       $size[0] = $size[0] ?: round($size[1] * $width/$height); 
       $size[1] = $size[1] ?: round($size[0] * $height/$width); 

      } 
     } 

     $result = ImageCreateTrueColor($size[0], $size[1]); 

     if (is_resource($result)) { 

      ImageSaveAlpha($result, true); 
      ImageAlphaBlending($result, true); 
      ImageFill($result, 0, 0, ImageColorAllocate($result, 255, 255, 255)); 
      ImageCopyResampled($result, $image, 0, 0, $x, $y, $size[0], $size[1], $width, $height); 

      ImageInterlace($result, true); 
      ImageJPEG($result, null, 90); 

     } 
    } 

    return false; 
} 

header('Content-Type: image/jpeg'); 
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '1:1', '600x'); 

?> 
+0

谢谢,现在工作正常,只有一个问题,它说$ size = array(imagesx($ image),imagesy($ image));不应该是$ size = array($ width,$ height);代替? – 2009-06-16 12:28:35