2009-06-16 8 views
7

J'ai codé une fonction qui recadre une image à un rapport d'aspect et enfin redimensionne alors et sorties comme JPG donné:PHP/GD - Redéfinition d'images et Recadrage

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

?> 

La fonction fonctionne comme prévu, mais Je crée une ressource d'image GD non requise, comment puis-je la réparer? J'ai essayé de joindre les deux appels, mais je dois faire quelques erreurs de calcul.

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

?> 

Toute aide est grandement appréciée, merci.

Répondre

12

Vous devrez modifier votre code de redimensionnement afin qu'il ne soit pas basé sur l'image recadrée pour commencer. Puisque vous voulez faire le recadrage et le redimensionnement en une fois, vous devez le calculer indépendamment.

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

Merci, cela fonctionne bien maintenant, juste une question de plus où il est dit $ size = array (imagesx ($ image), imagesy ($ image)); ne devrait-il pas être $ size = array ($ width, $ height); au lieu? –

+0

Oui, j'ai raté celui-là. Toutes les imagesx ($ image), imagesy ($ image) ont été remplacées par la nouvelle largeur et hauteur calculées. – monowerker

Questions connexes