2010-10-27 43 views
0

J'ai une image source (peut être n'importe quelle image avec et avoir des dimensions différentes). Je veux être en mesure de dire à php une zone de l'image à recadrer et à redimensionner. Par exemple:Recadrer une partie de l'image en php et la redimensionner

  • L'image source est de 800 x 800 pixels.
  • PHP sélectionne une zone de 50x50 pixels de l'image avec la zone de sélection commençant à 80 pixels du bord supérieur de l'image source et 100 pixels du bord gauche de l'image source
  • La zone sélectionnée est ensuite redimensionnée en 37x37 pixels.

J'ai essayé d'utiliser les fonctions imagecopyresampled() et imagecopyresized(), mais ils ont tous deux m'a donné un problème bizarre: imagecopyresampled() affiche l'image de sélection, mais est entourée par une zone noire équivalente aux dimensions de l'image source. imagecopyresized() sélectionne également la région sélectionnée, mais elle est simplement superposée sur l'image source. L'objectif final ici est de faire des vignettes à partir de l'image source.

Un exemple du code que je suis déjà en utilisant est:

list($width_orig, $height_orig) = getimagesize($filename); 
imagecopyresized($image_final, $image, 0, 0, 0, 0, 37, 37, $width_orig, $height_orig); 

Le ne fait pas exactement comme ci-dessus décrit la tâche, mais il illustre le problème que je courais dans.

Note:

Je comprends que faire une recherche sur ce sujet conduit à beaucoup de résultats, mais ils font référence la plupart des bibliothèques et des classes qui font beaucoup plus que je réellement besoin. Je préférerais avoir une compréhension de la solution et mettre en place quelque chose de plus efficace. Par conséquent, je ne cherche pas à être pointé vers un script exhaustif qui accomplit la tâche ci-dessus et 50 autres tâches. Je préfère comprendre ci-dessus afin que je puisse créer une solution optimale et personnalisée.

+0

Veuillez envoyer le code que vous avez déjà. Je suppose que vous n'utilisez pas 'imagecopyresized' correctement. –

+0

Avez-vous vérifié l'exemple ici: http://www.php.net/manual/fr/function.imagecopyresized.php? –

+0

Vérifié le manuel PHP - la plupart des fonctions semblent essayer de maintenir la proportion ou simplement redimensionner l'image entière. Alin, j'ai mis à jour mon post pour inclure un exemple de code existant comme demandé. – user396404

Répondre

0

Essayez ma classe de manipulation d'image, il fait exactement ce que vous voulez - http://github.com/philBrown/Tolerable/blob/master/library/Tolerable/Image/Manipulator.php

+0

Oui, mais le mien ne fait pas plus que les opérations requises. À tout le moins, ils peuvent lire la source pour un exemple de travail – Phil

+0

J'essayais d'éviter une solution existante, mais Phil a raison ... cela fait littéralement exactement ce dont j'ai besoin et rien de plus. J'essaie de comprendre comment le faire fonctionner maintenant ou au moins apprendre de la source. – user396404

+0

Je l'ai juste au travail. Cela fait exactement ce que j'essayais de faire sans surcharge supplémentaire, donc c'est acceptable. Merci beaucoup. – user396404

2

Votre question est en fait une question de logique. Pouvez-vous vérifier que snipped? Échelles si elles ne rentrent pas dans les parties les plus longues.

$w = imagesx($img); 
    $h = imagesy($img); 
    $newImage = imagecreatetruecolor($wNewOrj, $hNewOrj); 
    if(($w/$h)<($wNewOrj/$hNewOrj)){ 
     $hNew = $h * $wNewOrj/$w; 
     $wNew = $wNewOrj; 
    }else{ 
     $hNew = $hNewOrj; 
     $wNew = $w * $hNewOrj/$h; 
    } 
    $wDiff = round(abs($wNewOrj-$wNew)/2); 
    $hDiff = round(abs($hNewOrj-$hNew)/2); 
    imagecopyresampled($newImage, $img, 
         0,  0,  $wDiff, $hDiff, 
         $wNew, $hNew, $w-$wDiff, $h-$hDiff); 

    imagejpeg($newImage, $path, 85);