2010-01-05 9 views
15

Je voudrais recadrer une image en PHP et enregistrer le fichier. Je sais que vous êtes censé utiliser la bibliothèque GD mais je ne sais pas comment. Des idées?Recadrage de l'image en PHP

Merci

Répondre

23

Vous pouvez utiliser imagecopy pour rogner une partie obligatoire d'une image. La commande se présente comme suit:

imagecopy ( 
    resource $dst_im - the image object , 
    resource $src_im - destination image , 
    int $dst_x - x coordinate in the destination image (use 0) , 
    int $dst_y - y coordinate in the destination image (use 0) , 
    int $src_x - x coordinate in the source image you want to crop , 
    int $src_y - y coordinate in the source image you want to crop , 
    int $src_w - crop width , 
    int $src_h - crop height 
) 

code de PHP.net - une image 80x40 px est coupée à partir d'une image source

<?php 
// Create image instances 
$src = imagecreatefromgif('php.gif'); 
$dest = imagecreatetruecolor(80, 40); 

// Copy 
imagecopy($dest, $src, 0, 0, 20, 13, 80, 40); 

// Output and free from memory 
header('Content-Type: image/gif'); 
imagegif($dest); 

imagedestroy($dest); 
imagedestroy($src); 
?> 
+0

Merci pour la réponse rapide !! – user244228

+0

Cette méthode n'ajoute pas de fond noir aux images PNG? Je veux dire sur le fond transparent? – bayblade567

1

Pour recadrer une image en utilisant GD vous devez utiliser une combinaison de méthodes GD, et si vous regardez "Exemple # 1" sur la documentation de PHP de la méthode imagecopyresampled, il vous montre comment recadrer et sortir une image, vous auriez juste besoin d'ajouter du code pour capturer et écrire la sortie dans un fichier.

http://us2.php.net/manual/en/function.imagecopyresampled.php

Il existe également d'autres options, y compris Image Magick qui, si elle est installée sur votre serveur, vous pouvez accéder directement en utilisant la méthode exec de PHP (ou similaire) ou vous pouvez installer l'extension PHP Imagick, ce qui donne des images de qualité supérieure et, mon avis, est un peu plus intuitif et flexible pour travailler avec.

Enfin, j'ai utilisé la bibliothèque de classes open source PHPThumb, qui possède une interface assez simple et peut fonctionner avec plusieurs options en fonction de ce qui est sur votre serveur, y compris ImageMagick et GD.

0

J'utilise ce script dans certains projets et il est assez facile à utiliser: http://shiftingpixel.com/2008/03/03/smart-image-resizer/

Le script nécessite PHP 5.1.0 (qui est hors depuis 2005-11-24 - le temps de mettre à jour si pas encore à ce version) et GD (qui est rarement manquant de bons hôtes Web).

Voici un exemple de son utilisation dans votre code HTML:

<img src="/image.php/coffee-bean.jpg?width=200&amp;height=200&amp;image=/wp-content/uploads/2008/03/coffee-bean.jpg" alt="Coffee Bean" /> 
+0

shiftingpixel.com semble en panne pour le moment essayer le lien plus tard :) – AlexV

+0

shiftingpixel.com est de retour maintenant :) – AlexV

3

Cette fonction recadrer l'image en conservant ses proportions d'image :)

function resize_image_crop($image, $width, $height) 
    { 

     $w = @imagesx($image); //current width 

     $h = @imagesy($image); //current height 
     if ((!$w) || (!$h)) { $GLOBALS['errors'][] = 'Image couldn\'t be resized because it wasn\'t a valid image.'; return false; } 
     if (($w == $width) && ($h == $height)) { return $image; } //no resizing needed 
     $ratio = $width/$w;  //try max width first... 
     $new_w = $width; 
     $new_h = $h * $ratio;  
     if ($new_h < $height) { //if that created an image smaller than what we wanted, try the other way 
      $ratio = $height/$h; 
      $new_h = $height; 
      $new_w = $w * $ratio; 
     } 
     $image2 = imagecreatetruecolor ($new_w, $new_h); 
     imagecopyresampled($image2,$image, 0, 0, 0, 0, $new_w, $new_h, $w, $h);  
     if (($new_h != $height) || ($new_w != $width)) { //check to see if cropping needs to happen 
      $image3 = imagecreatetruecolor ($width, $height); 
      if ($new_h > $height) { //crop vertically 
       $extra = $new_h - $height; 
       $x = 0; //source x 
       $y = round($extra/2); //source y 
       imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); 
      } else { 
       $extra = $new_w - $width; 
       $x = round($extra/2); //source x 
       $y = 0; //source y 
       imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); 
      } 
      imagedestroy($image2); 
      return $image3; 
     } else { 
      return $image2; 
     } 
    } 
+0

Ne devrait pas avoir à faire plusieurs appels imagecopyresampled, tout peut être fait sur un appel si le décalage est calculé dans la largeur $ et $ hauteur. En outre, il peut être préférable de toujours forcer le redimensionnement pour s'assurer que l'image est enregistrée dans un nouveau format dépouillé des en-têtes et des en-têtes supplémentaires et forcé à une qualité spécifique. – Exit

-1

Vous pouvez utiliser ci-dessous méthode pour rogner l'image,

/*parameters are 
    $image =source image name 
    $width = target width 
    $height = height of image 
    $scale = scale of image*/ 
    function resizeImage($image,$width,$height,$scale) { 
     //generate new image height and width of source image 
     $newImageWidth = ceil($width * $scale); 
     $newImageHeight = ceil($height * $scale); 
     //Create a new true color image 
     $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); 
     //Create a new image from file 
     $source = imagecreatefromjpeg($image); 
     //Copy and resize part of an image with resampling 
     imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); 
     //Output image to file 
     imagejpeg($newImage,$image,90); 
     //set rights on image file 
     chmod($image, 0777); 
     //return crop image 
     return $image; 
    } 
+0

Il peut être utile pour les utilisateurs si vous ajoutez des commentaires à votre code pour expliquer ce que les parties clés font. Cela les aiderait à mieux comprendre et appliquer votre code – shrmn

+0

ok, j'ai ajouté –

0

Je viens de créer cette fonction et cela fonctionne pour mes besoins, créant un centré et recadrée image miniature Il est rationalisé et ne nécessite pas plusieurs appels imagecopy comme indiqué dans la réponse de webGautam.

Indiquez le chemin de l'image, la largeur et la hauteur finales et, éventuellement, la qualité de l'image. J'ai fait cela pour créer des miniatures, donc toutes les images sont sauvegardées en JPG, vous pouvez les modifier pour accommoder d'autres types d'images si vous en avez besoin. Le point principal ici est le calcul et la méthode d'utilisation de imagecopyresampled pour produire une vignette. Les images sont enregistrées en utilisant le même nom, plus la taille de l'image.

function resize_crop_image($image_path, $end_width, $end_height, $quality = '') { 
if ($end_width < 1) $end_width = 100; 
if ($end_height < 1) $end_height = 100; 
if ($quality < 1 || $quality > 100) $quality = 60; 

$image = false; 
$dot = strrpos($image_path,'.'); 
$file = substr($image_path,0,$dot).'-'.$end_width.'x'.$end_height.'.jpg'; 
$ext = substr($image_path,$dot+1); 

if ($ext == 'jpg' || $ext == 'jpeg') $image = @imagecreatefromjpeg($image_path); 
elseif($ext == 'gif') $image = @imagecreatefromgif($image_path); 
elseif($ext == 'png') $image = @imagecreatefrompng($image_path); 

if ($image) { 
    $width = imagesx($image); 
    $height = imagesy($image); 
    $scale = max($end_width/$width, $end_height/$height); 
    $new_width = floor($scale*$width); 
    $new_height = floor($scale*$height); 
    $x = ($new_width != $end_width ? ($width - $end_width)/2 : 0); 
    $y = ($new_height != $end_height ? ($height - $end_height)/2 : 0); 
    $new_image = @imagecreatetruecolor($new_width, $new_height); 

    imagecopyresampled($new_image,$image,0,0,$x,$y,$new_width,$new_height,$width - $x,$height - $y); 
    imagedestroy($image); 
    imagejpeg($new_image,$file,$quality); 
    imagedestroy($new_image); 

    return $file; 
} 
return false; 
}