2010-07-09 5 views
2

hy,redimensionner une image à une taille exacte, conserver l'aspect et remplir l'espace en php

Disons que je veux convertir une image en une taille exacte, par exemple: 400x300. L'astuce est, si l'image, en raison de son rapport d'aspect, ne rentre pas dans 400x300, puis placez-là avec des bordures noires. Une image 900x1200 serait convertie en 225x300 pour conserver son format, puis les bordures noires gauche et droite pour le faire 400x300.

photo originale:

||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 
||||||||||||||||||||||| 

après Redimensionner je veux ressembler à ceci:

_______________________ 
|+++++++++++++++++++++| 
|+++++++++++++++++++++| 
|+++++++++++++++++++++| 
|+++++++||||||||++++++| 
|+++++++||||||||++++++| 
|+++++++++++++++++++++| 
|+++++++++++++++++++++| 
|_____________________| 

le: "+++++++" je veux être un peu de couleur, et le "|||||||" sont l'image, au milieu!

Malheureusement je n'ai pas encore de code!

je veux quelque chose comme ceci: http://phpthumb.sourceforge.net/demo/demo/phpThumb.demo.demo.php#x22 grâce

+0

montre l'exemple réel de la photo. Je ne comprends pas ce que vous demandez. – VOX

+1

Vous n'avez pas posé de question (sauf si vous voulez que les gens écrivent simplement le code pour vous), alors le conseil le plus que je peux vous offrir est d'utiliser une bibliothèque graphique comme ImageMagick ou GD. –

+0

Les calculs de ratio d'aspect devraient sérieusement être le moindre souci, c'est maths simples que vous devriez être en mesure de comprendre assez rapidement. Le plus gros problème semble être que vous n'avez aucune idée par où commencer, n'est-ce pas? – deceze

Répondre

3

vous familiariser avec le gd functions, qui vous permettent de manipuler des images.

Vous aurez besoin de lire dans votre image en utilisant l'une des fonctions imagecreatefrom.... Ensuite, vous devrez créer une deuxième image en utilisant, par exemple, imagecreatetruecolor, que vous fill avec votre couleur de choix. Ensuite, vous copiez l'image originale dans la nouvelle image en utilisant imagecopyresampled, ce qui vous permet de le redimensionner dans le processus. Vous aurez besoin de calculer la nouvelle taille avec des mathématiques simples à l'avance, qui fonctionne comme getimagesize peut vous aider.

Alternativement, jouez avec la classe ImageMagick, ce qui est une alternative à gd vous pouvez ou ne pas trouver plus facile de travailler avec.

Bonne chance! :)

+0

@robertdd Il y a beaucoup d'exemples de code pour chaque fonction, l'exemple de ['imagecopyresampled'] (http://php.net/manual/fr/function.imagecopyresampled.php) est à peu près exactement ce que vous cherchez. – deceze

-2

Je suis un grand fan de l'édition et le redimensionnement des images à l'avance pour être la taille que je veux plutôt que le réglage de la largeur et la hauteur quand il est rendu. La performance est meilleure et vous n'avez pas à vous soucier de savoir comment les différents navigateurs peuvent gérer différemment. Donc, si vous n'avez pas de programme d'édition d'image, procurez-vous Paint.net. Gratuit et fonctionne bien.

+1

je veux que cela soit fait en php! – robertdd

+0

Cela n'a rien à voir avec ce que je dis. Je dis sur votre PC redimensionner l'image, puis lorsque votre page Web est rendue le navigateur n'a pas à faire le travail de le redimensionner. – JBrooks

0

Créez un div avec un arrière-plan noir et dimensionné à 400x300. Puis montrez votre image redimensionnée à l'intérieur de ce div. Vous pouvez même inclure une vérification pour vous assurer que l'image n'est pas l'aspect désiré avant d'afficher la div.

Quelque chose comme ceci:

<? 
$height-ratio = $height/300; 
$width-ratio = $width/400; 

if ($height-ratio == $width-ratio) { 
$ratio = $height-ratio; 
} elseif ($height-ratio > $width-ratio) { 
$ratio = $height-ratio; 
echo "<div class='blackbox'>"; 
} else { 
$ratio = $width-ratio; 
echo "<div class='blackbox'>"; 
} 

$newHeight = $height/$ratio; 
$newWidth = $width/$ratio; 
echo "<img src='".$imgSrc."' height='".$newHeight."' width='".$newWidth."' />"; 

if ($height-ratio != $width-ratio) 
echo "</div>"; 
?> 

Avec le soutien de css:

.blackbox { 
text-align: center; 
background-color: black; 
height: 300px; 
width: 400px; 
} 
+0

je dois enregistrer la photo, non seulement pour l'afficher – robertdd

+0

Bonne réflexion. Pas besoin de gaspiller de la bande passante sur un solide bg - en particulier si l'image va être sortie au format JPEG compressé, ce qui rend les couleurs solides semblent terribles. Si vous avez besoin de l'enregistrer, alors je collerais avec PNG ou SVG (SVG est moins soutenu, mais rendra l'arrière-plan le plus efficacement). –

+0

Vous ne perdez peut-être pas de bande passante sur un fond solide, mais vous téléchargez toujours une image potentiellement massive, qui est réduite à 400x300 par le navigateur. Ce qui gaspille probablement beaucoup plus de bande passante qu'un peu de bordure noire. – deceze

Questions connexes