Académique Documents
Professionnel Documents
Culture Documents
Lectura de
imágenes externas
Lectura de imágenes externas
La visualización de imágenes no Uno de los problemas que puede presentarse es la forma de indicar dónde están la imagen a
presenta ningún problema –lo visualizar. En Windows es necesario utilizar la "\" mientras que para Linux hay que usar "/".
hacemos habitualmente mediante
etiquetas HTML– cuando se Al utilizar "\" en Windows puede plantearse el problema de que vaya precedida por algún
encuentran en el espacio del caracter que pueda tener una significación especial como por ejemplo \n. Una solución para
servidor, bien sea propio o ajeno. evitar esos eventuales problemas es escribir "\\" como separador de niveles de directorio. De
esta forma el primer "\" indica que lo que le precede ha de interpretarse sin ninguna
El problema puede surgir cuando significación especial.
tratemos de almacenar esas
imágenes fuera del root del
servidor (una forma de impedir la <?
accesibilidad desde otras webs) y # indicar la ruta de la imagen
eso puede conseguirse mediante $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg";
las funciones que veremos en este
capítulo. # extraer el tipo de imagen según su la extension del fichero
for($i=strlen($original)-1;$i>0;$i--){
El primer paso será establecer la
if (substr($original,$i,1)=="."){
ruta y el nombre de la imagen. Al
margen tienes comentados $tipo=substr($original,$i+1);
algunos detalles al respecto. break;
}
El paso siguiente será extraer el }
formato de la imagen. Lo hice # las diferentes opciones dependiendo del formato de la imagen
leyendo la parte de la cadena switch($tipo){
comprendida entre el último punto case "jpg":
(.) y el final de la cadena que Header("Content-type:image/jpeg");
contiene el nombre de la imagen.
$nueva=imagecreatefromjpeg($original);
Mediante el switch elijo las imagejpeg($nueva);
instrucciones para cada tipo de break;
imagen que son similares pero con
matices según del formato. case "png":
Header("Content-type:image/png");
La visualización de la imagen $nueva=imagecreatefrompng($original);
contiene tres instrucciones:
imagepng($nueva);
Header, imagecreatefrom e
break;
imageXXX.
$f=imagecreatefromjpeg($i) Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
ó
$f=imagecreatefrompng($i)
ó ¡Cuidado!
$f=imagecreatefromgif($i)
Observa que en las imágenes en formato png se visualizan con deficiencias en los bordes de las
siendo $i la variable que recoge el áreas transparentes.
nombre y el path de la imagen
original y $f la variable que Con el método que vemos a continuación ese problema se reduce considerablemente.
contiene el resultado de la
ejecución de esta función.
imagecopyresampled() que
debe incluir –dentro del
<?
paréntesis– un montón de
parámetros que son (por este
# obtener la imagen
orden): $original="C:\\Apache\\htdocs\\cursoPHP\\images\\aviones4.jpg";
for($i=strlen($original)-1;$i>0;$i--){
$d que es el identificador de la if (substr($original,$i,1)=="."){
imagen destino, es decir el papel $tipo=substr($original,$i+1);
fotográfico que hemos creado en el break;
paso anterior. }
$f que es el identificador de la
}
imagen original (negativo) # tamaño del original
obtenido en el punto 2º. $tamano=getimagesize($original);
$orig_Ancho = $tamano[0];
Xd e Yd son las coordenadas de un $orig_Alto =$tamano[1];
punto situado en la esquina # estableceremos un margen en blanco alrededor de la imagen de 5 pixels
superior izquierda del papel a # igual por los cuatro lados
partir del que queremos que se $margen=10;
impresione la fotografía. Si # establecemos rocortes para reencuadrar la imagen
queremos una foto a sangre $recorte_izq=50;
pondremos 0,0 y, si quieres dejar
$recorte_sup=80;
márgenes en blanco, habrá que
$recorte_der=40;
poner los anchos de esos
márgenes (izquierdo y superior) $recorte_inf=60;
respectivamente. # calculamos las dimensiones para utilizar como parámetros
# en la funcion imagecopyresampled
Xf e Yf nos servirán para # ancho y alto original recortado
reencuadrar la foto original $Ancho_recortado=$orig_Ancho-$recorte_izq-$recorte_der;
recortando por la izquierda y por $Alto_recortado=$orig_Alto-$recorte_sup-$recorte_inf;
arriba, respectivamente, los # factores de ampliación en este caso iguales
anchos que se indiquen aquí en # sin distorsión de imagen
pixels. $ampliacion_X=1;
Dx e Dy indican el ancho y el alto $ampliacion_Y=1;
# dimensiones del soporte
(por este orden) que va a tener la
mancha de imagen en el positivo. $papel_Ancho=$Ancho_recortado*$ampliacion_X+ 2*$margen;
Ten en cuenta que no puedes $papel_Alto=$Alto_recortado*$ampliacion_Y+2*$margen;
salirte del papel así que esos # dimensiones de la mancha de imagen al positivar
valores sumados con los márgenes # hay que quitar los márgenes
(izquierdo y superior) no podrán $resultado_Ancho=$papel_Ancho -2*$margen;
ser mayores que las dimensiones $resultado_Alto=$papel_Alto -2*$margen;
que has elegido para el papel switch($tipo){
fotográfico en el punto 2º. case "jpg":
$importada=imagecreatefromjpeg($original);
Fx e Fy indican el ancho y el alto
break;
de la porción del original que
case "png":
tratamos de reproducir. Sumados
con Xf e Yf no pueden exceder el
$importada=imagecreatefrompng($original);
break;
tamaño del negativo.
case "gif":
Con estos parámetros la función ya $importada=imagecreatefromgif($original);
se encarga de redimensionar la break;
imagen (incluso distorsionarla si }
no hay proporcionalidad entre los
Header("Content-type:image/jpeg");
anchos y altos del original y del
soporte.
$im_base=imagecreatetruecolor($papel_Ancho,$papel_Alto);
$fondo=imagecolorAllocate($im_base,255,255,200);
imagefill($im_base,0,0,$fondo);
imagecopyresampled($im_base,$importada,$margen,$margen,
$recorte_izq,$recorte_sup,
$resultado_Ancho,$resultado_Alto,
$Ancho_recortado,$Alto_recortado);
imagejpeg($im_base);
ImageDestroy();
?>