0

Il ya longtemps, j'ai créé une petite bibliothèque pour redimensionner des images en utilisant imagemagick à travers system(...) parce que je ne pensais pas que les fonctions intégrées imagemagick pour PHP étaient suffisantes.Imagemagick génération de vignettes avec php - using -crop

Cependant, récemment, j'ai dû le porter sur un projet symfony et j'ai choisi d'utiliser sfThumbnailPlugin (si je me souviens bien). Ceci n'a malheureusement pas inclus la fonctionnalité de culture - c'est-à-dire pour spécifier une taille désirée, par ex. 300x300 px et avoir la vignette recadrée de sorte qu'il correspond. J'ai choisi d'implémenter cette fonctionnalité moi-même, mais il semble y avoir quelque chose qui ne va pas.

Chaque fois que je redimensionne une image à une taille désirée là où la largeur est supérieure à la hauteur, les proportions sont vissées. Jetez un oeil à cet exemple: http://i37.tinypic.com/9hkqrl.png - Dans cet exemple, la rangée du haut est les proportions correctes et la rangée du bas est le problème.

Dans l'exemple, le haut et le bas doivent avoir été rognés.

Voici le code pour la partie où la récolte se fait (les noms de variables doivent être explicites):

<?php 
    if ($width/$height > $this->maxWidth/$this->maxHeight) { 
     // then resize to the new height... 
       $command .= ' -resize "x'.$this->maxWidth.'"'; 

       // ... and get the middle part of the new image 
       // what is the resized width? 
       $resized_w = ($this->maxWidth/$height) * $width; 

       // crop 
       $command .= ' -crop "'.$this->maxHeight.'x'.$this->maxWidth.'+'.round(($resized_w - $this->maxWidth)/2).'+0"'; 
      } else { 
       // or else resize to the new width 
       $command .= ' -resize "'.$this->maxHeight.'x"'; 

       // ... and get the middle part of the new image 
       // what is the resized height? 
       $resized_h = ($this->maxHeight/$width) * $height; 

       // crop 
       $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight. 
          '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage'; 
      } 

Est est la deuxième partie de l'instruction if qui produit le mauvais code.

Quelqu'un peut-il corriger cela pour moi? De toute évidence, les calculs sont erronés.

Répondre

2

La solution est la suivante:

if ($width/$height > $this->maxWidth/$this->maxHeight) { 
     // then resize to the new height... 
       $command .= ' -resize "x'.$this->maxHeight.'"'; 

       // ... and get the middle part of the new image 
       // what is the resized width? 
       $resized_w = ($this->maxHeight/$height) * $width; 

       // crop 
       $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.'+'.round(($resized_w - $this->maxWidth)/2).'+0" +repage'; 
      } else { 
       $command .= ' -resize "' . $this->maxWidth . 'x"'; 
       $resized_h = ($this->maxWidth/$width) * $height; 

       // crop 
       $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight. 
          '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage'; 
      } 
+0

marque cette question ne peut pas répondre –

+0

demain. – phidah

1

Je dis une suggestion que vous pouvez l'essayer,

J'ai vu le lien d'image, je pense que les conditions ne sont pas vérifiées correctement.

vous avez vérifié l'état [(largeur/hauteur)> (maxWidth/maxHeight)] Au lieu de vérifier

si (largeur == hauteur) {} elseif (largeur> hauteur) {} else (width < height) {}

Cochez cette condition et, en fonction de cette condition, rognez l'image et redimensionnez.

Merci

Questions connexes