2009-10-31 8 views
3

Je veux imiter le comportement de finition de Photoshop (recadrer la zone qui est couverte par la même couleur de tous les côtés) avec GD et PHP mais je manque d'idées sur la façon d'accomplir cela.Avec PHP/GD, comment couper une image?

Si quelqu'un a une idée sur la façon de faire cela, j'aimerais beaucoup l'entendre.

Merci d'avance.

+0

Êtes-vous marié à GD pour cela? ImageMagick le simplifie déjà. –

Répondre

4

La solution la plus simple que je peux penser est:

  1. Découvrez la couleur du pixel en haut à gauche. Parcourez l'image ligne par ligne, horizontalement et verticalement, en commençant respectivement par le haut, le bas, la gauche et le côté droit. Si une ligne est composée uniquement de la couleur rencontrée dans le coin supérieur gauche, il s'agit d'un espace vide ajustable. Omettez cette ligne de l'image résultante en augmentant la coordonnée x ou y de votre fonction imagecopy *().

Non testé, mais pourrait fonctionner.

BTW, ImageMagick peut le faire hors de la boîte: http://www.imagemagick.org/Usage/crop/#trim

2

Here's fonction de l'échantillon (qui peut également ajouter un rembourrage):

// Trims an image then optionally adds padding around it. 
// $im = Image link resource 
// $bg = The background color to trim from the image 
// $pad = Amount of padding to add to the trimmed image 
//  (acts simlar to the "padding" CSS property: "top [right [bottom [left]]]") 
function imagetrim(&$im, $bg, $pad=null){ 

    // Calculate padding for each side. 
    if (isset($pad)){ 
     $pp = explode(' ', $pad); 
     if (isset($pp[3])){ 
      $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[3]); 
     }else if (isset($pp[2])){ 
      $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[1]); 
     }else if (isset($pp[1])){ 
      $p = array((int) $pp[0], (int) $pp[1], (int) $pp[0], (int) $pp[1]); 
     }else{ 
      $p = array_fill(0, 4, (int) $pp[0]); 
     } 
    }else{ 
     $p = array_fill(0, 4, 0); 
    } 

    // Get the image width and height. 
    $imw = imagesx($im); 
    $imh = imagesy($im); 

    // Set the X variables. 
    $xmin = $imw; 
    $xmax = 0; 

    // Start scanning for the edges. 
    for ($iy=0; $iy<$imh; $iy++){ 
     $first = true; 
     for ($ix=0; $ix<$imw; $ix++){ 
      $ndx = imagecolorat($im, $ix, $iy); 
      if ($ndx != $bg){ 
       if ($xmin > $ix){ $xmin = $ix; } 
       if ($xmax < $ix){ $xmax = $ix; } 
       if (!isset($ymin)){ $ymin = $iy; } 
       $ymax = $iy; 
       if ($first){ $ix = $xmax; $first = false; } 
      } 
     } 
    } 

    // The new width and height of the image. (not including padding) 
    $imw = 1+$xmax-$xmin; // Image width in pixels 
    $imh = 1+$ymax-$ymin; // Image height in pixels 

    // Make another image to place the trimmed version in. 
    $im2 = imagecreatetruecolor($imw+$p[1]+$p[3], $imh+$p[0]+$p[2]); 

    // Make the background of the new image the same as the background of the old one. 
    $bg2 = imagecolorallocate($im2, ($bg >> 16) & 0xFF, ($bg >> 8) & 0xFF, $bg & 0xFF); 
    imagefill($im2, 0, 0, $bg2); 

    // Copy it over to the new image. 
    imagecopy($im2, $im, $p[3], $p[0], $xmin, $ymin, $imw, $imh); 

    // To finish up, we replace the old image which is referenced. 
    $im = $im2; 
} 
+0

Fonctionne comme un charme, merci pour cela. – FelipeOliveira

+0

Pouvez-vous donner un exemple de contribution attendue à $ bg? –