Este documento describe cómo crear y manipular imágenes con transparencia y capas en PHP. Explica cómo asignar colores transparentes, superponer imágenes con diferentes grados de transparencia, dar transparencia a imágenes externas, rotar imágenes, y trabajar con transparencia en capas rotadas.
KELA Presentacion Costa Rica 2024 - evento Protégeles
67 Php. Superponer, Rotar Y Dotar De Transparencia A Imagenes
1. Superponer, rotar y dar transparencia a imágenes
Colores transparentes
Superposición de áreas transparentes
PHP permite crear colores con <?
determinado color de /* Creamos una imagen en color verdadero, le aplicamos un color
transparencia. Para ello se utiliza de fondo (para evitar el negro por defecto) y creamos un nuevo
la función: color que utilizaremos para los bordes de rectangulos posteriores*/
Header("Content-type:image/jpeg");
ImageColorAllocateAlpha() $im_base=imagecreatetruecolor(610,140);
que debe contener dentro del $fondo=imagecolorAllocate($im_base,255,255,200);
paréntesis los siguientes $negro=imagecolorAllocate($im_base,0,0,0);
parámetros (separados por
imagefill($im_base,0,0,$fondo);
comas):
# definimos las componentes de un nuevo color
$im que es el identificador de la $R=255; $G=00; $B=00;
imagen que ha sido creada /* vamos a construir una escala de transparencias
previamente. de 0 a 10 que correspondería con valores de transparencia
de 0% al 100%.
R,G,B que son valores numéricos Crearemos un bucle que dibuje rectangulos rellenos
(o variables) que contienen -en
con el color definido en la variable trans que irá aplicando
una escala de 0 a 255- los la
intensidad luminosa de cada uno
al color básico los diferentes grados de transparencia
de los tres colores primarios (rojo, y le pondremos un contorno negro para encuadrarlos*/
verde y azul).
for($i=0;$i<=10;$i++){
trans es un valor numérico $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,(int)($i*127/10));
(comprendido entre 0 y 127) que imagefilledrectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $trans);
indica el grado de transparencia de imagerectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $negro);
la tinta. El valor 0 indica opacidad }
total, mientras que 127 establece
#creamos un nuevo color y repetimos el proceso con nuevos rectangulos
la transparencia total de ese color.
#superpuestos a los anteriores y con las transparencias en sentido
En el ejemplo que tienes a la opuesto
derecha hemos incluido dos # es decir, de 100 a 0%
escalas de transparencias $R=0; $G=0; $B=255;
superpuestas a intervalos del 10% for($i=0;$i<=10;$i++){
(desde 0 hasta 100%) $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,127-(int)($i*127/10));
transformados a la escala 0-127. imagefilledrectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $trans);
imagerectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $negro);
El orden de superposición –similar
a las capas de otros programas }
gráficos– se corresponde con el # visualizamos el resultado
orden de las instrucciones de imagejpeg($im_base);
creación. Los resultados de las ImageDestroy();
últimas funciones se superponen ?>
siempre a los obtenidos como
consecuencia de la ejecución de
las anteriores. Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
Transparencia en Transparencia de imágenes externas
imágenes externas
<?
Mediante la utilización de la # obtener la imagen
función imagecopymerge es $original="c:apachehtdocscursoPHPimagesaviones4.jpg";
posible ajustar el grado de
# buscar el formato de la imagen mediante su extensión
transparencia de una imagen
externa.
for($i=strlen($original)-1;$i>0;$i--){
if (substr($original,$i,1)=="."){
La función imagecopymerge() $tipo=substr($original,$i+1);
requiere que se incluyan (dentro break;
del paréntesis y separados por }
comas y por el orden en el que los }
incluimos) los siguientes # tamaño del original extraido del array devuelto por getimagesize
parámetros: $tamano=getimagesize($original);
$destino que es el identificador de $orig_Ancho = $tamano[0];
la imagen sobre la que se va a $orig_Alto =$tamano[1];
colocar la transparencia. Como es # estableceremos un margen en blanco alrededor de la imagen de 10 pixels
lógico, deberá haber sido creada # igual por los cuatro lados
antes de incluir la función. $borde=10;
$Ancho=$orig_Ancho+2*$borde;
$origen es el identificador de la $Alto=$orig_Alto+2*$borde;
imagen que pretendemos incluir
# creamos la imagen segun el formato original
con un determinado grado de
switch($tipo){
transparencia.
case "jpg":
Xd e Yd son las coordenadas de un $importada=imagecreatefromjpeg($original);
punto situado en la esquina break;
superior izquierda de la imagen case "png":
destino a partir del que queremos $importada=imagecreatefrompng($original);
que se impresione la nueva break;
imagen. Si queremos una imagen case "gif":
a sangre pondremos 0,0 y, si $importada=imagecreatefromgif($original);
quieres dejar márgenes, habrá break;
que poner los anchos de esos }
márgenes (izquierdo y superior)
Header("Content-type:image/jpeg");
respectivamente.
# creamos una imagen nueva, un color de fondo y la rellenamos con él
Xf e Yf nos servirán para $im_base=imagecreatetruecolor($Ancho,$Alto);
reencuadrar la foto original $fondo=imagecolorAllocate($im_base,255,255,200);
recortando por la izquiera y por imagefill($im_base,0,0,$fondo);
arriba, respectivamente, los # superponemos la imagen importada posicionandola y aplicandole
anchos que se indiquen aquí en # una trasmparencia de 50
pixels. imagecopymerge( $im_base, $importada, $borde, $borde ,
2. 0, 0, $orig_Ancho, $orig_Alto ,50 );
Dx e Dy indican el ancho y el alto
(por este orden) que va a tener la imagejpeg($im_base);
mancha de imagen en el positivo. ImageDestroy();
Ten en cuenta que no puedes
?>
salirte del papel así que esos
valores sumados con los márgenes
(izquierdo y superior) no podrán Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
ser mayores que las dimensiones
que has elegido para la imagen
destino
Si observas los resultados obtenidos en el ejemplo en el que intentamos dar transparencia
opacidad es el último de los a una imagen en formato png podrás observar que deja bastante que desear y produce
parámetros de la función al que un efecto indeseado por el recorte de las zonas presuntamente transparentes.
puede asignársele un valor
comprendido entre 0 y 100. Esta situación nos obliga a replantear la situación para prever esta circunstancia y recurrir
a un truco que parece solventar ese problema. La modificación del código fuente es la
Representa el porcentaje de incluimos aquí debajo.
opacidad de la imagen
superpuesta. Con un valor 100
sería totalmente opaca y con 0 la Header("Content-type:image/jpeg");
transparencia sería total. $im_base=imagecreatetruecolor($Ancho,$Alto);
$fondo=imagecolorAllocate($im_base,255,255,200);
La función imagecopy imagefill($im_base,0,0,$fondo);
/* el truco consiste en crear una segunda imagen (im_truco)cuyas
dimensiones coincidan con las de la imagen transparente
Mediante esta función se puede que pretendemos colocar. Le asignamos como color el fondo el mismo
copiar sobre una imagen una parte
de la imagen destino y hacemos transparente ese color en esa imagen.
de otra. Permite extraer porciones
Después hacemos una copia de la imagen original sobre la imagen
de imágenes con su tamaño
original sin que permita ampliarlas im_truco y sustituimos en la función imagecopymerge la
ni reducirlas. Su sintaxis es la imagen original por la obtenida mediante esta chapucilla */
siguiente: $im_truco=imagecreatetruecolor($orig_Ancho, $orig_Alto);
$fondo1=imagecolorAllocate($im_truco,255,0,200);
imagecopy($d,$o,$x,$y,$X,$Y,$A, imagefill($im_truco,0,0,$fondo1);
$H) donde: imagecolortransparent ($im_truco,$fondo1);
imagecopy($im_truco, $importada, 0, 0, 0, 0, $orig_Ancho, $orig_Alto);
$d el identificador de la imagen
destino, $o el identificador de la
imagecopymerge( $im_base , $im_truco, $borde , $borde ,
imagen original, $x y $y las 0 , 0 ,$orig_Ancho, $orig_Alto ,60 );
coordenadas donde se posicionará imagejpeg($im_base);
–en la imagen destino– la esquina ImageDestroy();
superior izquierda de la porción
copiada.
$X y $Y son los anchos de los Ver el nuevo resultado
recortes izquierdo y superior de la
imagen a copiar y $A y $H el
ancho y el alto del área de imagen La función imagecolortransparent ($imagen,$color) permite hacer transparente –en la
que pretendemos copiar. imagen indicada mediante la variable $imagen– el color señalado en la variable $color.
Rotación de imágenes La variable $color deberá estar definida previamente mediante la función
imagecolorAllocate u alguna otra que permita identificar un color determinado.
Mediante la funcion:
imagerotate($im,ang,$fondo) es
posible presentar imágenes Rotación de imágenes
rotadas.
El parámetro $im es el
identificador de la imagen a rotar,
ang es el ángulo de rotación <?
(expresado en grados y tomado # obtener la imagen
en sentido trigonométrico) y $original="c:apachehtdocscursoPHPimagesaviones3.jpg";
$fondo es un color de fondo for($i=strlen($original)-1;$i>0;$i--){
asociado a la imagen a rotar que if (substr($original,$i,1)=="."){
puede ser definido mediante la $tipo=substr($original,$i+1);
función imagecolorallocate u otra break;
función que permita asociar
}
colores a imágenes.
}
switch($tipo){
Transparencia en la case "jpg":
rotación de imágenes $importada=imagecreatefromjpeg($original);
break;
Hemos intentado explorar la case "png":
posibilidad de lograr imágenes $importada=imagecreatefrompng($original);
rotadas con fondo transparente. Y break;
la cosa resulta, cuando menos case "gif":
complicada. Cuando se trata de $importada=imagecreatefromgif($original);
insertarlas sobre un fondo plano la break;
situación puede emularse }
fácilmente sin más que asignar Header("Content-type:image/jpeg");
como color de fondo de la rotación
$fondo=imagecolorallocatealpha($importada,255,255,0,40);
uno idéntico al del fondo plano
sobre el que ha de situarse la
$im_base=imagerotate($importada,30,$fondo);
imagen. imagejpeg($im_base);
ImageDestroy();
Otra de las alternativas probadas ?>
fué tratar de usar
imagecolortransparent en el color
de fondo de rotación de la imagen. Ver ejemplo
Es evidente que ese grado de
transparencia solo lo lograríamos
con un formato png ó jpg. Pero... Diferencias entre imagecreate e imagecreatetruecolor
no funciona.
La alternativa siguiente fué tratar Este es el código fuente de un script que lee una imagen externa y la copia íntegra sobre
de crear una imagen con fondo otra imagen creada mediante PHP. Si visualizas el ejemplo podrás observar las diferencias
transparente e insertar en ella la entre usar la función imagecreate o utilizar imagecreatetruecolor.
imagen rotada asignándole
3. transparencia a la capa que
<?
contiene la imagen rotada. Ahí nos $original="c:apachehtdocscursoPHPimagesaviones3.jpg";
encontramos con algunas
dificultades.
for($i=strlen($original)-1;$i>0;$i--){
La primera de ellas es que fondo if (substr($original,$i,1)=="."){
transparente sólo lo permiten las $tipo=substr($original,$i+1);
imágenes que son creadas break;
mediante la función imagecreate. }
Si se crean mediante la función }
imagecreatetruecolor esa opción switch($tipo){
no funciona. case "jpg":
Otra diferencia entre ambas $importada=imagecreatefromjpeg($original);
funciones tiene también relación break;
con los colores de fondo. Mientras case "png":
que en el caso de imagecreate se $importada=imagecreatefrompng($original);
asigna como color de fondo el que break;
se haya definido inmediatamente case "gif":
después de crear la imagen, $importada=imagecreatefromgif($original);
cuando se trata de break;
imagecreatetruecolor se }
asignará siempre un fondo negro y $dimensiones=getimagesize($original);
para cambiar ese color será
$Ancho_original=$dimensiones[0];
necesario recurrir a la función
imagefill. $Alto_original=$dimensiones[1];
Header("Content-type:image/png");
Pero la felicidad completa parece $im_base=imagecreate($Ancho_original+20,$Alto_original+20);
que no existe. Al intentar explorar $fondo=imagecolorallocate($im_base,255,0,0);
la primera de estas opciones imagecolortransparent($im_base,$fondo);
hemos podido observar que el imagecopy($im_base,$importada,10,10,0,0,$Ancho_original,$Alto_original);
precio a pagar por la dichosa imagepng($im_base);
transparencia es obtener una ImageDestroy();
imagen final de no demasiado
?>
buena calidad.
Mejor lo compruebas tu mism@ en
Ver ejemplo
el ejemplo que tienes a la derecha.
Ejemplo resumen
Transparencia en capas
rotadas Aquí tienes un ejemplo en el que hemos utilizado superposiciones de imágenes, con giros,
recortes y diferentes grados de transparencia.
Cuando trabajamos con una
Ver ejemplo resumen Ver codigo fuente
imagen truecolor en la que
vamos incluyendo en diferentes
capas (mediante copy ó
copymerge) otras imágenes – Ejercicio nº 34
recortadas, rotadas, creadas a
partir de otra imagen, etc.– la Diseña un script que genere una imagen dinámica a partir de una fotografía. El script debe
transparencia de los colores de los encuadrarla (recortándola por los cuatro bordes) y colocar en la parte inferior derecha un
fondos de rotación no plantea
texto que diga: «Todos los derechos reservados».
ningún problema.
Es suficiente usar la función
imagecolortransparent, eso sí,
aplicándola a la imagen
correspondiente antes de Anterior Indice Siguiente
insertarla mediante la opción copy
en la imagen final.