странное поведение imagefilledpolygon

-=KPOT=-

Новичок
странное поведение imagefilledpolygon

сегодня заметил странное поведение библиотеки GD (хотя может и мой код но врядли)

есть такая штука на сервак кидается рисунок png в нем есть контуры ограниченные точками определнного цвета мы эти контуры определяем и должны закрасить их одним цветом так вот
если на рисунке 699 x 371 pixels 24 области если красить цветом например FFA334 (пробовал и FF0000 и др) то на все провсе уходит ок 1.7 сек
ставлю цвет СССССС или 0066CC (зависимостри не пойму)
и время зарисовки увеличивается на порядок 20 секунд!!!

че за фигня собственно?
GD 2.0.28
рисунки png сохраняю закрашенный в png

закрашиваю imagefilledpolygon проблема в ней скорее всего т.к. код не трогаю а добавляю 2 идентификатор цвета (FF0000)
и заставляю закрашивать им а не идентификатором с цветом 0066CC и все быстро

я даж не знаю на че думать в логах ниче нет да и работает в конце концов он правильно :confused:
 

vitus

мимо проходил
возможно это с палитрой связано ?
на изначальном png - есть точки с цветом CCCCCC или 0066CC ?
другие фигуры - пробовал рисовать?
 

-=KPOT=-

Новичок
нет этих цветов нет
создаются два цвета которых в палитре нет изначально (там всего 3 цвета есть)
один для контура другой для заливки

другие фигуры не пробовал нужны именно многоугольники
 

ksnk

прохожий
Можешь выделить кусок кода + картинка, на котором это все видно?
 

-=KPOT=-

Новичок
щас будет

-~{}~ 24.08.05 20:11:

http://klim.cool4all.com/gd/admin/objconfig.php?main=map&id=1

-~{}~ 24.08.05 20:17:

вот собственно и сама функция определения границ и закраска их

PHP:
function get_contour($floor,$info,$color)
{
	if (!$info['flag']) errorshow ('карта может быть добавленна только к объекту типа "ТЦ"');
	
	$file='tmp/main.png';
	if (!file_exists($file)) errorshow ('нет файла для создания карты');
	$poligon=array();
	$map=array(); // массив точек (каждый элемент отдельный контур)
	$points=array();
	$param=getimagesize($file);
	if ($param AND in_array($param[2],array(1,2,3,6))) // получение параметров изображения
	{
		$width=$param[0];
		$height=$param[1];
		if ($param[2]==1)	  $resource=imagecreatefromgif($file);
		elseif ($param[2]==2) $resource=imagecreatefromjpeg($file);
		elseif ($param[2]==3) $resource=imagecreatefrompng($file);
		elseif ($param[2]==6) $resource=imagecreatefromwbmp($file);
		$transparent_color = imagecolorallocate ($resource, 255, 255, 255); // белый цвет
		$red = imagecolorallocate ($resource, 255, 0, 0); // красный цвет для контура
		$main_color = imagecolorallocate ($resource, $color[0], $color[1], $color[2]); // цвет заливки (оранж)
		imagecolortransparent ($resource,$transparent_color); // белый прозрачный
		for ($y=0;$y<$height;$y++) // алгоритм жука
		{
			for ($x=0;$x<$width;$x++)
			{
				$rgb=imagecolorsforindex($resource,imagecolorat($resource,$x,$y)) or die ('111');
				if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=0) // точка отличная от фона
				{
					$goX=$x;
					$goY=$y-1;
					$direct='north';
					/*****обход контура*******/
					while ($goX.' '.$goY!=$x.' '.$y)
					{
						$rgb=imagecolorsforindex($resource,imagecolorat($resource,$goX,$goY));
						if ($rgb['red']==255 AND $rgb['green']==255 AND $rgb['blue']==0) array_push($poligon,$goX,$goY);
						switch($direct)
						{
							case 'north':
								if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=255)
								{
									$goX--; $direct='west';
								}
								else
								{
									$goX++; $direct='east';
								}
								break;
							case 'east':
								if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=255)
								{
									$goY--; $direct='north';
								}
								else
								{
									$goY++; $direct='south';
								}
								break;
							case 'south':
								if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=255)
								{
									$goX++; $direct='east';
								}
								else
								{
									$goX--; $direct='west';
								}
								break;
							case 'west':
								if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=255)
								{
									$goY++; $direct='south';
								}
								else
								{
									$goY--; $direct='north';
								}
								break;
						}
					}
					/*****обход контура*******/
					/*****закраска очередного контура сохран координат*******/
					if (count($poligon)>2) 
					{
						imagefilledpolygon ($resource,$poligon,count($poligon)/2,$main_color);
						imagepolygon ($resource,$poligon,count($poligon)/2,$red);
						array_push($map,implode(',',$poligon));
					}	
					$poligon=array(); 
					/*****закраска очередного контура сохран координат*******/
				} 
			}
		}
		imagepng($resource,'tmp/bild.png');
		imagedestroy($resource);
	}
	return $map;
}
 

ksnk

прохожий
[li]А может путь у "жука" слишком длинный?
[li]Если писать
PHP:
 imagefilledpolygon ($resource,$poligon,min(10,count($poligon)/2),$main_color); 
  imagepolygon ($resource,$poligon,min(10,count($poligon)/2),$red);
Лучше не становится?
Хотя, наверное, нет :)

-~{}~ 24.08.05 19:30:

Ха! Дык не используй цвета с R, G или B ==255 и живи долго с счастливо!
 

-=KPOT=-

Новичок
путь при любом цвете один и тотже рисунок обрабатывается один и тот же

зависит только от цвета если я ставлю вместо
PHP:
imagefilledpolygon ($resource,$poligon,count($poligon)/2,$main_color);
вот так
PHP:
imagefilledpolygon ($resource,$poligon,count($poligon)/2,$red);
делается быстро

Ха! Дык не используй цвета с R, G или B ==255 и живи долго с счастливо!
так при цвете AAAAAA он тоже тормозит ни че не понимаю !!!!
 

ksnk

прохожий
Твоя проблема в том, что ты ползаешь по картинке, которую сам-же тут-же и разрисовываешь.
PHP:
  if ($rgb['red']==255 AND $rgb['green']==255 AND $rgb['blue']==0) array_push($poligon,$goX,$goY); 
...
               if ($rgb['red']!=255 AND $rgb['green']!=255 AND $rgb['blue']!=255) 
...
Проверять следует цвета XXXX00, FFFF00 и FFFFXX, где XX - не 0 и не FF.

А ты не пробовал сначала исползать всю картинку жуком, а уже потом рисовать?
 

SiMM

Новичок
А зачем вообще все эти извраты, когда, как я понял, достаточно сменить цвет в палитре?
 

-=KPOT=-

Новичок
Автор оригинала: SiMM
А зачем вообще все эти извраты, когда, как я понял, достаточно сменить цвет в палитре?
тебе хорошо ты понял (вот он свежий взгляд), а я в дебри полез не догнал сразу не заметил такой штуки спасибо ;)

-~{}~ 24.08.05 21:03:

to ksnk
я конечно алгоритм посмотрю на свежую голову
но почему она тормозит мне уже просто интересно

-~{}~ 25.08.05 13:03:

проблема решена
в алгоритме недочеты были испраленны и все стало ок
спасибо всем
 
Сверху