Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Криво генерируется изображение
 
 автор: Алексей25   (05.09.2009 в 03:43)   письмо автору
 
 

В процессе создания сайта мне потребовалась функция генерации картинки.
Необходимый код нашел тут: http://www.softtime.ru/scripts/upload.php
+ код взят из php справочника,
и далее модифицировал его под свои нужды:
1. загрузить логотип на сервер, 2.обжать его по размерам: http://ipdip.org/logo/6.png
3. сделать на основе всех логотипов единое изображение.

Однако на практике столкнулся с проблемой:
функция изменяет цвет изображения на 3ем шаге (в результате единое изображение портится):
http://ipdip.org/file/CustomLocations.png
Подскажите пожалуйста как этого избежать.

<input type='file' name='filename'>
//$_POST['sub'] - кнопка сохранить
//$provlistid - № записи (например 6)

//1. ЗАГРУЗКА ЛОГОТИПА
if (isset ($_FILES["filename"]) && isset ($_POST['sub']) && $_FILES["filename"]["name"] != '') {
if($_FILES["filename"]["type"] == 'image/jpeg') {$ras = 'jpeg';}
if($_FILES["filename"]["type"] == 'image/gif') {$ras = 'gif';}
if($_FILES["filename"]["type"] == 'image/png') {$ras = 'png';}
if ($_FILES["filename"]["type"] != 'image/jpeg') {$r0 = 1;}
if ($_FILES["filename"]["type"] != 'image/gif') {$r0 = 1;}
if ($_FILES["filename"]["type"] != 'image/png') {$r0 = 1;}
if ($r0 != 1)
 {
     echo ("Файл долден быть типа jpeg, gif, png");
     exit;
   }
   else {
    if($_FILES["filename"]["size"] > 4096)
   {
     echo ("Размер файла превышает 4096 байт");
     exit;
   }
   if(copy($_FILES["filename"]["tmp_name"],
     "../temp/".$provlistid.".".$ras))
   {
   if ($ras == 'jpeg') {$old = imageCreateFromJpeg("../temp/".$provlistid.".".$ras);}
if ($ras == 'gif') {$old = imageCreateFromGif("../temp/".$provlistid.".".$ras);}
if ($ras == 'png') {$old = imageCreateFromPng("../temp/".$provlistid.".".$ras);}
$w = imageSX($old);
$h = imageSY($old);
if ($w > 25 or $h > 16)
{
$ws = $w/25;
$hs = $h/16;
}
else {
$ws = 1;
$hs = 1;
}
//2. ОБЖИМАЕМ ИЗОБРАЖЕНИЕ
$w_new=round($w/$ws);  //размер картинки по широте
$h_new=round($h/$hs);   //размер картинки по высоте
$new = imageCreate($w_new, $h_new); //создание пустой картинки

imageCopyResized($new, $old, 0, 0, 0, 0, $w_new, $h_new, $w, $h); //обработка изображения
imagePng($new, "../logo/".$provlistid.".png"); //сохраняем логотип в папку
//imageDestroy($old);
imageDestroy($new);

$size_img=GetImageSize("../logo/".$provlistid.".png"); //определяем габариты изображения
echo "<IMG src='../logo/".$provlistid.".png' $size_img><br>"; //выводим на экран загруженное изображение
unlink("../temp/".$provlistid.".".$ras);










//3. ДЕЛАЕМ ЕДИНЫЙ ФАЙЛ ИЗОБРАЖЕНИЕ
$w_newe = 25;
$h_newe = 16;
//обновление изображение
$location = mysql_query("SELECT id FROM prov",$db);
$locations = mysql_fetch_array($location);
$locationmun = mysql_num_rows ($location); //считаем, сколько вообще записей в базе (например 16)
$sizex=0;
$sizey=16;
$ximg = $locationmun * 25; //Определяем, какой длины должно быть изображение 16*25
$newe = imageCreate($ximg, $sizey); /////
do
{
$flag = imageCreateFromPng("../logo/".$locations['id'].".png"); 
imageCopy($newe, $flag, $sizex, 0, 0, 0, $w_newe, $h_newe); //Заносим в цикле все флаги в переменную $newe
$sizex = $sizex + 25;
}
while ($locations = mysql_fetch_array($location));
imagePng($newe, "../file/CustomLocations.png"); // Сохраняем переменную с занесенными переменными в один файл.
imageDestroy($newe);
}}}

  Ответить  
 
 автор: Metandrostenalon   (05.09.2009 в 08:21)   письмо автору
 
   для: Алексей25   (05.09.2009 в 03:43)
 

$newe = imageCreate($ximg, $sizey); /////

попробуйте замнеить на

$newe = imagecreatetruecolor($ximg, $sizey); /////

  Ответить  
 
 автор: Алексей25   (05.09.2009 в 10:10)   письмо автору
 
   для: Metandrostenalon   (05.09.2009 в 08:21)
 

При варианте $newe = imagecreatetruecolor($ximg, $sizey); /////
и при многих других которые я перепробовал бьется прозрачность.
При таком коде вся прозрачность превращается в черный цвет.

  Ответить  
 
 автор: t3ma   (05.09.2009 в 14:57)   письмо автору
 
   для: Алексей25   (05.09.2009 в 10:10)
 

$newe = imagecreatetruecolor($ximg, $sizey); /////

и используйте функцию imagesavealpha();

  Ответить  
 
 автор: Zilog   (05.09.2009 в 23:19)   письмо автору
 
   для: t3ma   (05.09.2009 в 14:57)
 

а я бы посоветовал отличный класс на www.verot.net
большинство задач решает на ура, минимум кода.

  Ответить  
 
 автор: Алексей25   (06.09.2009 в 19:29)   письмо автору
 
   для: t3ma   (05.09.2009 в 14:57)
 

Огромное спасибо!
почитал какие есть еще функции работы с изображением, поэксперементировал и в результате пришел к следующему коду:


//3. ДЕЛАЕМ ЕДИНЫЙ ФАЙЛ ИЗОБРАЖЕНИЕ
$w_newe = 25;
$h_newe = 16;
//обновление изображение
$location = mysql_query("SELECT id FROM prov",$db);
$locations = mysql_fetch_array($location);
$locationmun = mysql_num_rows ($location); //считаем, сколько вообще записей в базе (например 16)
$sizex=0;
$sizey=16;
$ximg = $locationmun * 25; //Определяем, какой длины должно быть изображение 16*25 
$newe = imagecreatetruecolor($ximg, $sizey); //imagecreatetruecolor - пустое изображение с черной заливкой
$white = imagecolorallocate($newe, 255, 255, 255); //белая заливка
imagefill($newe, 0, 0, $white); // Заливаем белым цветом фон пустое изображение  
imagecolortransparent ($newe, $white); // Все что нарисовано белым цветом делаем прозрачным

do
{
$flag = imageCreateFromPng("../logo/".$locations['id'].".png");
imageCopy($newe, $flag, $sizex, 0, 0, 0, $w_newe, $h_newe);
$sizex = $sizex + 25;
}
while ($locations = mysql_fetch_array($location));
imagepng ($newe, "../file/CustomLocations.png");

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования