2010-12-14 43 views
3

Ok, fondamentalement, je veux que toutes les images soient des carrés de 170x170px. Ainsi, si une image est pas un carré que je veux qu'il soit redimensionnée, puis recadrée au milieu ..Redimensionner puis recadrer PHP

J'ai passé de nombreuses heures à jouer avec cela et je suis nulle part .. J'ai eu à rogner une section de l'image plus grande etc, mais j'ai spécifiquement besoin de l'image à redimensionner, puis recadrée ..

Toute aide serait grandement appréciée.

// get image size of img 
$x = @getimagesize($img); 
// image width 
$sw = $x[0]; 
// image height 
$sh = $x[1]; 

if($sw > $sh) // Horizontal Rectangle? 
{ 
    $newwidth = ($sw/$sh)*170; 
    $newheight=170; 
    $x_pos = ($sw - $sh)/2; 
    $x_pos = ceil($x_pos); 
    $y_pos=0; 
} 

else if($sh > $sw) // Vertical Rectangle? 
{ 
    $newheight = ($sh/$sw)*170; 
    $newwidth=170; 
    $y_pos = ($sh - $sw)/2; 
    $y_pos = ceil($y_pos); 
    $x_pos=0; 
} 
else //Already Square 
{ 
    $newheight=170; 
    $newwidth=170; 
} 

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image 
$im = @ImageCreateFromPNG ($img) or // or PNG Image 
$im = @ImageCreateFromGIF ($img) or // or GIF Image 
$im = false; // If image is not JPEG, PNG, or GIF 

if (!$im) { 
    // We get errors from PHP's ImageCreate functions... 
    // So let's echo back the contents of the actual image. 
    readfile ($img); 
} else { 
    // Create the resized image destination 
    $thumb = @ImageCreateTrueColor (170, 170); 
    // Copy from image source, resize it, and paste to image destination 
    imagecopyresampled($thumb, $im, 0, 0, 180, $y_pos, 170, 170, $newwidth, 
    $newheight); 
} 
+0

Veuillez corriger le formatage. – metrobalderas

+0

Ive fourni un script de travail s'il vous plaît vérifier comme résolu (voir ci-dessous) – Teson

Répondre

2

Besoin de quelques travaux, mais il devrait vous donner assez pour commencer.

function crop($filename, $width, $height) 
{ 
    // image resource, assuming it's PNG 
    $resource = imagecreatefrompng($filename); 
    // resource dimensions 
    $size = array(
     0 => imagesx($resource), 
     1 => imagesy($resource), 
    ); 
    // sides 
    $longer = (int)($size[0]/$width > $size[1]/$height); 
    $shorter = (int)(!$longer); 
    // ugly hack to avoid condition for imagecopyresampled() 
    $src = array(
     $longer => 0, 
     $shorter => ($size[$shorter]-$size[$longer])/2, 
    ); 
    // new image resource 
    $new = imagecreatetruecolor($width, $height); 
    // do the magic 
    imagecopyresampled($new, $resource, 
     0, 0, 
     $src[0], $src[1], 
     $width, $height, 
     $size[$longer], $size[$longer] 
    ); 

    // save it or something else :) 
} 

Edit: Essayer d'expliquer "hack laid" ci-dessus.

Deux paramètres en question sont $src_x et $src_y, extrait de manual:

imagecopyresampled() aura une zone rectangulaire de src_image de src_h largeur de src_w et de la hauteur à la position (src_x, src_y) et placez-le en une zone rectangulaire de dst_image de largeur dst_w et de hauteur dst_h à position (dst_x, dst_y).

Signification si la largeur de l » $filename est plus longue, src_x doit être 0, et si la hauteur est plus longue, src_y doit être 0. Traduit en code, il ressemblerait à quelque chose comme ceci:

$src = ($size[$shorter]-$size[$longer])/2; 

if ($longer === 1) 
{ 
    imagecopyresampled($new, $resource, 
     0, 0, 
     $src, 0, 
     $width, $height, 
     $size[$longer], $size[$longer] 
    ); 
} 
else 
{ 
    imagecopyresampled($new, $resource, 
     0, 0, 
     0, $src, 
     $width, $height, 
     $size[$longer], $size[$longer] 
    ); 
} 
+0

Pourriez-vous éventuellement commenter en outre sur le hack que vous avez utilisé. En outre ce qui me donnait le plus de tracas était tous les différents aspects de la fonction imagecopyresampled() ... Merci –

+0

Voir la mise à jour de la réponse. "Hack hack" est très probablement un mauvais choix de mots. Le truc, c'est que j'ai une classe pour le traitement d'image, et pour montrer un exemple de crop, j'ai dû modifier un peu la logique. Par conséquent, hack moche :) –

0

Utilisez-vous ImageMagic? Si non, vous devriez. http://php.net/manual/en/book.imagick.php

+0

OP tag gd ... vous pouvez le convaincre peut-être par des exemples? – ajreal

+0

Non ..? C'est le principe peut réaliser exactement ce que je veux .. Je préfère me concentrer sur ce que je sais .. Merci –

+0

Je suppose que je ne suis pas sûr de ce que vous utilisez alors. Je peux mettre quelques exemples en place, c'est très simple. Cependant, utiliser ImageMagick signifie que vous en aurez besoin installé dans votre système qui héberge l'application. C'est généralement le cas dans les systèmes * nix mais pas sur Windows. –

4

ok, voici un travail;

<? 
$img = 'leaf.jpg'; 
// get image size of img 
$x = @getimagesize($img); 

// image dimensions 
$sw = $x[0]; 
$sh = $x[1]; 

//dest size 
$dSize = 170; 

//find smallerst part and get needed scale and offset 
$yOff = 0; 
$xOff = 0; 
if($sw < $sh) { 
    $scale = $dSize/$sw; 
    $yOff = $sh/2 - $dSize/$scale/2; 
} else { 
    $scale = $dSize/$sh; 
    $xOff = $sw/2 - $dSize/$scale/2; 
} 

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image 
$im = @ImageCreateFromPNG ($img) or // or PNG Image 
$im = @ImageCreateFromGIF ($img) or // or GIF Image 
$im = false; // If image is not JPEG, PNG, or GIF 

if (!$im) { 
    // We get errors from PHP's ImageCreate functions... 
    // So let's echo back the contents of the actual image. 
    readfile ($img); 
} else { 
    // Create the resized image destination 
    $thumb = @ImageCreateTrueColor ($dSize,$dSize); 
    // Copy from image source, resize it, and paste to image destination 
    imagecopyresampled($thumb, $im, 
    0, 0, 
    $xOff,$yOff, 
    $dSize, $dSize, 
    $dSize/$scale ,$dSize/$scale); 
} 
header('content-type:image/jpeg'); 
imagejpeg($thumb); 
//imagejpeg($im);