2010-05-21 14 views
2

Voici mon code actuel:PHP GD - Comment puis-je modifier mon Thumbnail Creator pour recadrer les images portrait du centre?

$image = 'img.jpg'; 
$source = imagecreatefromjpeg($image); 

list($origWidth, $origHeight) = getimagesize($image); 

$imgH = 75; 
$imgW = $origWidth/$origHeight * $imgH; 
$thumb = imagecreatetruecolor($imgW, $imgH); 

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $imgW, $imgH, $origWidth, $origHeight); 

Cela me permet de produire une image avec une hauteur fixe de 75 pixels. Ce que je voudrais faire est d'avoir une taille d'image constante de 99x75 pixels. Les images de portrait qui ne rentrent pas dans cette image seront rognées à partir du centre (donc le centre de l'original reste le centre de la vignette - si cela a du sens).

Comment est-ce que je peux faire ceci?

Répondre

2

Eh bien, c'est un calcul pur. Vous voulez atteindre une taille de 99x75, et vous voulez seulement couper de la largeur. Donc d'abord, vous redimensionnez pour ajuster la hauteur. C'est ce que vous avez fait, mais fait pour l'adapter à une hauteur de 75. Passer à 99. Ensuite, vous, vérifiez la largeur à < = 75. Si ce n'est pas alors vous faites ceci:

if($imgW > 75) 
{ 
    $diff = $imgw - 75; // this is what's extra 
    $srcX = ceil($diff/2); // this is where your img starts from 
    $imgW = 75; 
} 
imagecopyresampled($thumb, $source, 0, 0, $srcX, 0, $imgW, $imgH, $origWidth, $origHeight); // notice that src X changed accordingly. 

Ainsi, si la largeur après le premier "redimensionnement" est de 100 et que vous vouliez 75, vous calculez le diff = 25, le divisez par 2 et ceil = 13, alors vous dites à la fonction GD de commencer à copier l'image de 13, au lieu de 0, et gardez toujours 75 hauteur. Cela signifie qu'il copiera de la largeur 13 à 88 => le centre.

J'espère que c'est ce que vous vouliez. salutations, Gabriel

0

(non testé)

define('THUMB_WIDTH', 99); 
define('THUMB_HEIGHT', 75); 

$image = 'img.jpg'; 
$source = imagecreatefromjpeg($image); 
$thumb = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT); 

$cutX = imagesx($source) > THUMB_WIDTH; 
$cutY = imagesy($source) > THUMB_HEIGHT; 

$source_x = $cutX ? imagesx($source)/2 - (THUMB_WIDTH/2) : 0; 
$source_y = $cutY ? imagesx($source)/2 - (THUMB_HEIGHT/2) : 0; 
$source_width = $cutX ? THUMB_WIDTH : imagesx($source); 
$source_height = $cutY ? THUMB_HEIGHT : imagesy($source); 

imagecopyresampled($thumb, $source, 0, 0, $source_x, $source_y, $source_width, $source_height, THUMB_WIDTH, THUMB_HEIGHT); 
1
define('THUMB_WIDTH', 99); 
define('THUMB_HEIGHT', 75); 

$image = imagecreatefromjpeg('img.jpg'); 
$thumb = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT); 

list($image_width, $image_height) = getimagesize($image); 
$x0 = ($image_width - THUMB_WIDTH )/2; 
$y0 = ($image_height - THUMB_HEIGHT)/2; 
imagecopy(
    $thumb,  // resource $dst_im 
    $image,  // resource $src_im 
    0,   // int $dst_x 
    0,   // int $dst_y 
    $x0,   // int $src_x 
    $y0,   // int $src_y 
    THUMB_WIDTH, // int $src_w 
    THUMB_HEIGHT // int $src_h 
); 

Ce code utilise la fonction imagecopy pour copier région 99x75px de l'image source. La largeur de la source - 99/2 renvoie la coordonnée x à partir de laquelle commencer la copie. La hauteur de la source - 75/2 renvoie la coordonnée y. Si vous souhaitez générer des miniatures de taille fixe à partir d'images de taille arbitraire, consultez this article.