2009-06-16 19 views
7

mam zakodowane funkcji, że uprawy obraz do danego proporcjami i wreszcie następnie zmienia rozmiar go i wyprowadza go jako JPG:PHP/GD - Kadrowanie i zmiana rozmiaru obrazów

<?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; 
} 

?> 

Funkcja działa zgodnie z oczekiwaniami, ale Tworzę niepotrzebny zasób obrazu GD, jak go naprawić? Próbowałem dołączyć do obu połączeń, ale muszę wykonać jakieś błędne obliczenia.

<?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'); 

?> 

Każda pomoc jest bardzo ceniona, dzięki.

Odpowiedz

12

Będziesz musiał zmodyfikować swój kod rozmiaru, aby nie opierał się na przyciętym obrazie. Ponieważ chcesz przycinać i zmieniać rozmiar za jednym razem, musisz obliczyć je niezależnie.

<?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

Dzięki, teraz działa dobrze, jeszcze jedno pytanie, w którym jest napisane $ size = array (imagesx ($ image), imagesy ($ image)); nie powinno to być $ size = array ($ width, $ height); zamiast? –

+0

Tak, tęskniłem za tym. Wszystkie obrazy imagesx ($ image), imagesy ($ image) zamiast tego zostały zmienione na nową obliczoną szerokość i wysokość. – monowerker

Powiązane problemy