2009-06-16 21 views
7

cortar y redimensionar He codificado una función que recorta una imagen a una relación de aspecto determinado y, finalmente, a continuación, cambia el tamaño y la emite en formato JPG:PHP/GD - Imágenes

<?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 función funciona como se esperaba, pero Estoy creando un recurso de imagen GD no requerido, ¿cómo puedo solucionarlo? Intenté unir ambas llamadas, pero debo estar cometiendo errores de cálculo.

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

?> 

Cualquier ayuda es muy apreciada, gracias.

Respuesta

12

Deberá modificar su código de ajuste de tamaño para que no se base en la imagen recortada para comenzar. Dado que desea hacer el recorte y el cambio de tamaño de una sola vez, debe calcularlo de manera independiente.

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

Gracias, está funcionando bien ahora, sólo una pregunta más, donde dice $ (($ imagen) imagesx ($ imagen), imagesy) size = array; no debería ser $ size = array ($ ancho, $ alto); ¿en lugar? –

+0

Sí, me perdí esa. Todas las imágenesx ($ image), imagesy ($ image) se cambiaron a la nueva anchura y altura calculadas. – monowerker