Объединение изображений в PHP

У меня есть сайт www.iniciativa-iex.com , он связан с твиттером, он получает данные с использованием API для каждого пользователя и отображает его / ее изображение профиля на скроллере. Раньше я получал данные каждый раз, когда был вызван веб-сайт, но это была настоящая проблема, потому что это вызывало множество звонков, и токены моего приложения были удалены очень часто. Теперь я включил все фотографии,

 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); 

EDIT: Я получил код работает, но теперь он показывает искаженную, плохое качество изображения, и нужно CHMOD 0777 для работы, anny предложение?

ПРОСМОТР ИЗОБРАЖЕНИЯ http://img.ruphp.com/php/users.png

Благодаря!

Я не собираюсь писать для вас весь ваш код, но я предоставлю вам одну из моих функций, которая создала бы вот так:

 <img1> <img2> <img3> <img4> <img5> <img6> 

Из шести изображений. Мой скрипт предполагает, что размер каждого изображения составляет 240x20 , вам придется делать это по-своему.

 // 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); 

Изменить: изображения не достаточно большие

Если ваши изображения ( $sub ) недостаточно велики (например, 40x40 пикселей), вы должны проверить их размер и использовать 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); } 

Или обновите его по своему усмотрению.