imagenes - Fusionar imágenes en PHP
imagecopymerge (1)
Tengo un sitio web www.iniciativa-iex.com
, está conectado con Twitter, obtiene los datos usando la API para cada usuario y muestra su imagen de perfil en el desplazador. Solía obtener los datos cada vez que se llamaba al sitio web, pero era un problema real porque realizaba muchas llamadas y los tokens de mis aplicaciones se borraban con mucha frecuencia. Ahora lo hice unir todas las imágenes,
include ''../twitter/LibTwitter.php'';
$sql = mysql_query("SELECT * FROM `users` WHERE `suspended` != ''true'' ORDER BY id DESC");
$fullW = mysql_num_rows($sql)*128;
$fullH = 128;$width1 = 0;
$img = imagecreate($fullW, $fullH);
while($result = mysql_fetch_array($sql)) {
$userid = $result["userid"];
$busqueda = $twitter->usersShow($userid, null);
$src = $busqueda["profile_image_url"];
$filetype = str_replace(".", "", substr($src, -4));
if ($filetype == "rmal"){$filetype = "";}
$file = str_replace("_normal.".$filetype, "_reasonably_small.".$filetype, $src);
switch($filetype){
case ''png'':
$sub = imagecreatefrompng($file) or die( "Cannot open $filetype file `$file - $src` where USER = `$userid`/n");
break;
case ''gif'':
$sub = imagecreatefromgif($file) or die( "Cannot open $filetype file `$file - $src` where USER = `$userid`/n");
break;
case ''jpeg'':
case ''jpg'':
case ''JPG'':
case '''':
$sub = imagecreatefromjpeg($file) or die( "Cannot open $filetype file `$file - $src` where USER = `$userid`/n");
break;
}
if(!$sub){die(''Missing sub'');}imagecopy ( $img, $sub, $width1 , 0, 0, 0, 128, 128);
// imagecopy ( $img, $sub, $width1 , 0, 0, 0, $width, $height) or die( "Cannot copy $filetype file `$file - $src` where USER = `$userid`/n");
$width1 = $width1 + 128;
imagedestroy($sub);
}
imagepng($img, ''users.png'');
imagedestroy($img);
EDITAR: Obtuve el código funcionando pero ahora muestra una imagen distorsionada y de mala calidad, y necesito que CHMOD 0777 funcione, ¿alguna sugerencia?
DESPLAZADOR DE IMAGEN http://www.iniciativa-iex.com/cron/users.png
¡Gracias!
No voy a escribir todo el código para ti, pero te proporcionaré una de mis funciones que creó una imagen como esta:
<img1> <img2>
<img3> <img4>
<img5> <img6>
De seis imágenes. Mi script asume que el tamaño de cada imagen es 240x20
, tendrás que hacerlo a tu manera.
// Sizes of one image
$width = 240;
$height = 20;
// The whole image
$fullW = $width*2;
$fullH = $height*3;
// Allocate image with exact size for 6 images
$img = imagecreate( $fullW, $fullH) or die("Cannot Initialize new GD image stream/n");;
// I was creating images based on their name, so here''re name parts
$parts = array( ''real'', ''imaginary'');
$keys = array( ''normalized'', ''code'', ''code2'');
// Two loops iterating trough all images, you''ll be doing it one probably
foreach( $parts as $i => $part){
foreach( $keys as $j => $key){
// Generate name
$file = $prefix . ''_'' . $part . ''_'' . $key . ''.png'';
// I didn''t need any special handling for errors, add your own, destroy image
// if anything goes wrong and so on
$sub = imagecreatefrompng( $file) or die( "Cannot open png file `$file`/n");
// After looking this function up in manual everything should be clear
imagecopy ( $img, $sub, $i*$width, $j*$height, 0, 0, $width, $height) or die( "Cannot copy data from `$file`/n");
// Unload current image
imagedestroy( $sub);
}
}
// Save image
imagepng( $img, $prefix . ''.png'');
echo "Saving: $prefix.png/n";
imagedestroy( $img);
Editar: las imágenes no son lo suficientemente grandes
Si sus imágenes ( $sub
) no son lo suficientemente grandes (por ejemplo, 40x40
px) debe verificar su tamaño y usar imagecopyresampled()
:
if( (imagesx( $sub) < $width) || (imagesy( $sub) < $height)){
imagecopyresampled( $img, $sub, $width1, 0, 0, 0, $width, $height, imagesx( $sub), imagesy( $sub));
} else {
imagecopy ( $img, $sub, $width1 , 0, 0, 0, $width, $height);
}
O actualícelo como lo desee y necesite.