Foros del Web » Programando para Internet » PHP »

Combinar imágenes transparentes

Estas en el tema de Combinar imágenes transparentes en el foro de PHP en Foros del Web. Hola a todos, Estoy intentando crear postales con PHP pero no soy muy hábil con la librería GD. Mi intención es incrustar una foto en ...
  #1 (permalink)  
Antiguo 04/10/2012, 10:48
Avatar de OkusPokus  
Fecha de Ingreso: diciembre-2007
Mensajes: 21
Antigüedad: 12 años
Puntos: 0
Combinar imágenes transparentes

Hola a todos,
Estoy intentando crear postales con PHP pero no soy muy hábil con la librería GD. Mi intención es incrustar una foto en un fondo con transparencia. Os lo explico con imágenes:



He logrado esto:



Como veis, no he podido lograrlo. Este es el codigo que estoy utilizando:

Código:
//tomamos la imagen "base"
$imagen1 = imagecreatefrompng($foto1);
		 
if ($extension == "image/jpeg")
	$imagen2 = imagecreatefromjpeg($foto2);

if ($extension == "image/png")
	$imagen2 = imagecreatefrompng($foto2);

if ($extension == "image/gif")
	$imagen2 = imagecreatefromgif($foto2);

$fondoAncho = imagesx($imagen1);
$fondoAlto = imagesy($imagen1);
$textoAncho = imagesx($imagen2);
$textoAlto = imagesy($imagen2); 
		 
$imagen3 = imagecreatetruecolor($fondoAncho, $fondoAlto); 

imagecolortransparent($imagen3, 0x00FF00); 
imagefilledrectangle($imagen3, $fondoAncho, $fondoAlto, $fondoAncho, $fondoAlto, 0x00FF00);

imagecopy($imagen1,$imagen2,0,$fondoAlto - $textoAlto,0,0,$textoAncho,$textoAlto); 

imagecopy($imagen3, $imagen1, 0, 0, 0, 0, $fondoAncho, $fondoAlto); 
		 
imagepng($imagen3, $salida);
La variable $foto1 es el fondo (que en el ejemplo es lo que pone "happy holidays" y que tiene transparencias) y $foto2 es la imagen que sube el usuario (que en el ejemplo es la seta con ojos).
¿Me podíais echar una mano?
  #2 (permalink)  
Antiguo 08/10/2012, 04:34
Avatar de OkusPokus  
Fecha de Ingreso: diciembre-2007
Mensajes: 21
Antigüedad: 12 años
Puntos: 0
Respuesta: Combinar imágenes transparentes

Nadie sabe como hacerlo? :(
  #3 (permalink)  
Antiguo 08/10/2012, 08:23
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: Combinar imágenes transparentes

Cita:
Iniciado por OkusPokus Ver Mensaje
Nadie sabe como hacerlo? :(
calma, recuerda que algunos mensajes pueden tardar en responder, o nunca obtener respuesta.

lo hice hace como un año e investigando la librería GD me topé con imagealphablending y imagesavealpha y aplique ésto:

Código PHP:
Ver original
  1. $rs_image         = imagecreatetruecolor($sc_width, $sc_total_height * $sc_total);
  2.   //deshabilita el modo alpha, para que copie la imágen con el canal alpha completo
  3.   imagealphablending($rs_image, false);
  4.   //establece que la imagen se guarde con el canal alpha
  5.   imagesavealpha($rs_image, true);
  6.  
  7.   //elimina el fondo negro rellenando con una imagen 1x1 completamente transparente
  8. $cleaner          = imagecreatefrompng('cleaner.png');
  9. imagecopyresized($rs_image, $cleaner, 0, 0, 0, 0, $sc_width, ($sc_total_height * $sc_total), 1, 1);
  10. imagedestroy($cleaner);

la lógica es para un generador de Sprites, pero puede adaptarse

consultando el manual de PHP puedes conseguir lo que necesites
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #4 (permalink)  
Antiguo 16/10/2012, 06:06
Avatar de OkusPokus  
Fecha de Ingreso: diciembre-2007
Mensajes: 21
Antigüedad: 12 años
Puntos: 0
Respuesta: Combinar imágenes transparentes

El código que me propones es un ejemplo verdad? Porque no veo en el código la combinación de las dos imágenes.
Por favor, me podrías aclarar las dudas y decirme como serían los dos códigos combinados para que funcionen??
Muchas gracias por tu respuesta...
  #5 (permalink)  
Antiguo 16/10/2012, 10:18
Avatar de OkusPokus  
Fecha de Ingreso: diciembre-2007
Mensajes: 21
Antigüedad: 12 años
Puntos: 0
Respuesta: Combinar imágenes transparentes

He conseguido que el fondo sea transparente con ese código, eso está bien.
Pero lo que quiero es que la imagen "icono" se quede por debajo de la postal (llamada $tapa_caratula).
Este es el código que he utilizado...
Código PHP:
//tomamos la imagen "base"
$tapa_caratula imagecreatefrompng($foto1);

$icono imagecreatefrompng("templates/default/imgs/icono.png");

imagecopyresampled(
  
$tapa_caratula,
  
$icono,
  (
imagesx($tapa_caratula) / 2) - (imagesx($icono) / 2) + 10,
  
80,
  
0,
  
0,
  
imagesx($icono),
  
imagesy($icono),
  
imagesx($icono),
  
imagesy($icono)
);

//deshabilita el modo alpha, para que copie la imágen con el canal alpha completo
imagealphablending($tapa_caratulafalse);
//establece que la imagen se guarde con el canal alpha
imagesavealpha($tapa_caratulatrue);
     
//elimina el fondo negro rellenando con una imagen 1x1 completamente transparente
$cleaner          imagecreatefrompng('templates/default/imgs/pixel-trans.png');
imagecopyresized($caratula_base$cleaner0000imagesx($tapa_caratula),
imagesy($tapa_caratula),
imagesx($tapa_caratula),
imagesy($tapa_caratula));

// Damos salida a la imagen final a un archivo
imagepng($tapa_caratula$salida); 
Así es como me aparece la imagen resultante:


Pero quiero que el icono quede por debajo de la postal y aparezca cuando la imagen sea transparente, como sale a continuacion:


Seguro que es una tontería, pero no doy con ella. ¿Me podeis echar un cable?
  #6 (permalink)  
Antiguo 16/10/2012, 10:31
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: Combinar imágenes transparentes

¿a que te refieres con el fondo de la postal?

el código que te proporcioné necesita una imágen PNG de 1x1 pixel completamente transparente, cosa que puede hacer en cualquier editor como GIMP, o fireworks, y lo que hace es limpiar el lienzo de una imagecreatetruecolor, para que puedas plazmar otros PNG con transparencia, las otras funciones se usan para garantizar que la librería GD las guarde con el canal alpha.

ese código lo utilicé para hacer un sprite generator y resultó satisfactorio con íconos png transparentes, sin el cleaner.png se guardaban con un fondo negro.

si quieres que el ícono quede solapado por la postal, entonces la postal debe de tener el recuadro con canal alpha y ser la última en copiar al resource de imagecreatetruecolor

en psudocódigo:

crear al imagen con imagecreatetruecolor
aplicar la limpieza con cleaner.png
copiar el ícono en su posición
copiar la postal (si el recuadro tiene canal alpha 255 o 100%, no borrará el ícono)

listo, en teoría debe hace lo que quieres
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: combinar, variables, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:00.