PHP - Centrar una imagen en otra con GD

 
Vista:

Centrar una imagen en otra con GD

Publicado por olivares (33 intervenciones) el 18/01/2017 12:55:10
Hola! intento hacer un script con el cual centro una imagen dentro de otra, esto lo consigo jugando con las coordenadas x,y,x,y ... el caso es que el tamaño de la imagen varia y no se como habría que hacerlo..

Lo que hago es crear una imagen en blanco de 200x200, redimensiono proporcionalmente una imagen con tamaño aleatorio para adaptarla en 200x200, entonces esta imagen redimensionada la coloco en la imagen en blanco de 200x200.

Con esto copio la imagen a la imagen en blanco:

1
imagecopyresampled($tmp,$img_original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);

La imagen queda así:

retoque

Si le doy coordenadas 50,50,0,0 me centra bien en imágenes con tamaños altos y anchos iguales pero en cambio esta imagen con un alto mayor al ancho me la deja así:

retoque

Lo quiero hacer de forma automatizada por lo que no puedo ir cambiando las coordenadas según el tamaño de la imagen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
//Ruta de la imagen original
$rutaImagenOriginal="images/pruebas/caravaning/320-346_FOTOFITXA_80MATERIALCAMPING_LAMPARACEITE320346_IMG1.jpg";
 
//Creamos una variable imagen a partir de la imagen original
$img_original = imagecreatefromjpeg($rutaImagenOriginal);
 
//Se define el maximo ancho y alto que tendra la imagen final
$max_ancho = 200;
$max_alto = 200;
 
//Ancho y alto de la imagen original
list($ancho,$alto)=getimagesize($rutaImagenOriginal);
 
//Se calcula ancho y alto de la imagen final
$x_ratio = $max_ancho / $ancho;
$y_ratio = $max_alto / $alto;
 
//Si el ancho y el alto de la imagen no superan los maximos,
//ancho final y alto final son los que tiene actualmente
if( ($ancho <= $max_ancho) && ($alto <= $max_alto) ){//Si ancho
$x_ratio = $max_ancho / $ancho;
$y_ratio = $max_alto / $alto;
}
/*
* si proporcion horizontal*alto mayor que el alto maximo,
* alto final es alto por la proporcion horizontal
* es decir, le quitamos al ancho, la misma proporcion que
* le quitamos al alto
*
*/
elseif (($x_ratio * $alto) < $max_alto){
$alto_final = ceil($x_ratio * $alto);
$ancho_final = $max_ancho;
}
/*
* Igual que antes pero a la inversa
*/
else{
$ancho_final = ceil($y_ratio * $ancho);
$alto_final = $max_alto;
}
//Creamos una imagen en blanco de tamaño $ancho_final  por $alto_final .
$tmp=imagecreatetruecolor(200,200);
$fondo = imagecolorallocate($tmp, 255, 255, 255);
imagefilledrectangle($tmp, 0, 0, 200, 200, $fondo);
 
//Copiamos $img_original sobre la imagen que acabamos de crear en blanco ($tmp)
imagecopyresampled($tmp,$img_original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);
 
//Se destruye variable $img_original para liberar memoria
imagedestroy($img_original);
//Definimos la calidad de la imagen final
$calidad=95;
//Se crea la imagen final en el directorio indicado
imagejpeg($tmp,"imagen/retoque.jpg",$calidad);
// ¡no olvide imprimir la cabecera correcta!
header('Content-Type: image/jpeg');
 
// y finalmente, imprimir el resultado
imagejpeg($tmp);
imagedestroy($tmp);
 
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder