Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

gd rectangulos com cantos redondos

Recommended Posts

diokhan

boas,

como posso fazer para ao desenhar com GD em php, os cantos do rectângulo ficarem redondos? eu consegui esta função mas nao me apareceu nenhum gráfico 🤔

function ImageRectangleWithRoundedCorners(&$im, $x1, $y1, $x2, $y2, $radius, $color)
	{
		// draw rectangle without corners
		imagefilledrectangle($im, $x1+$radius, $y1, $x2-$radius, $y2, $color);
		imagefilledrectangle($im, $x1, $y1+$radius, $x2, $y2-$radius, $color);
		// draw circled corners
		imagefilledellipse($im, $x1+$radius, $y1+$radius, $radius*2, $radius*2, $color);
		imagefilledellipse($im, $x2-$radius, $y1+$radius, $radius*2, $radius*2, $color);
		imagefilledellipse($im, $x1+$radius, $y2-$radius, $radius*2, $radius*2, $color);
		imagefilledellipse($im, $x2-$radius, $y2-$radius, $radius*2, $radius*2, $color);
	}

$radius = 1;
ImageRectangleWithRoundedCorners($img, $gm+($b['start']*$fscale), $gm+$x, $gm+($b['end']*$fscale), $gm+$x+12, $b['color']);


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
mjamado

E tem mesmo de ser com o GD?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
diokhan

eu já tenho o gráfico feito em GD, por isso que pensei em só alterar / implementar esta função para ficar com os cantos redondos


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
mjamado

Então não te posso dar grande ajuda.

Assim a primeira coisa que me salta à vista é que não estás nem a gravar, nem a "cuspir" a imagem... Mas como deves ter mais código à volta disso, não sei se te esqueceste ou está noutra zona do código...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
diokhan

a imagem eu guardo num ficheiro e depois vou busca-lo para apresentar, mas nem grava a imagem, sempre que entra na função para colocar os cantos redondos a pagina deve entrar em ciclo infinito e não apresenta nada e não grava imagem nenhuma 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
mjamado

Em ciclo infinito porquê, se a função não tem ciclos?  :nono1:

Que valores estás a passar à função?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
diokhan

não tem ciclo o que coloquei aqui, mas na minha função tenho um ciclo onde faço o gráfico, agora está a funcionar, arranjei outro script, o que eu tentei inicialmente estava no php.net mas arranjei outro.

mas fica aqui o script que usei e como o uso

function imagefillroundedrect($im,$x,$y,$cx,$cy,$rad,$col)
	{
		// Draw the middle cross shape of the rectangle
	    imagefilledrectangle($im,$x,$y+$rad,$cx,$cy-$rad,$col);
	    imagefilledrectangle($im,$x+$rad,$y,$cx-$rad,$cy,$col);
	    $dia = $rad*2;
		// Now fill in the rounded corners
	    imagefilledellipse($im, $x+$rad, $y+$rad, $rad*2, $dia, $col);
	    imagefilledellipse($im, $x+$rad, $cy-$rad, $rad*2, $dia, $col);
	    imagefilledellipse($im, $cx-$rad, $cy-$rad, $rad*2, $dia, $col);
	    imagefilledellipse($im, $cx-$rad, $y+$rad, $rad*2, $dia, $col);
	}


...

foreach ($graph as $b)
			{
				// posicao texto inicio
				if ($b['start'] < 10){
					$tsmargin = -7;
				}elseif ($b['start'] < 100){
					$tsmargin = -12;
				}else{
					$tsmargin = -17;
				}
				// posicao texto fim
				if ($b['end'] < 10){
					$temargin = 4;
				}elseif ($b['end'] < 100){
					$temargin = 4;
				}else{
					$temargin = 4;
				}

				// grafico
				$graphDraw = $drawGraph->imagefillroundedrect($img, $gm+($b['start']*$fscale), $gm+$x, $gm+($b['end']*$fscale), $gm+$x+12, $radius, $b['color']);
				// texto inicio
				imagefttext($img, 8, 0, $gm+($b['start']*$fscale)+$tsmargin-3, $gm+$x+10, $colors['red'], $fonts['tahoma'], $b['start']);
				// texto fim
				imagefttext($img, 8, 0, $gm+($b['end']*$fscale)+$temargin, $gm+$x+10, $colors['red'], $fonts['tahoma'], $b['end']);
				// label
				imagefttext($img, 8, 0, $gm+($b['start']*$fscale), $x+15, $colors['black'], $fonts['tahoma'], $b['label2']." - ".$b['label1']." - (".$b['label3'].") - (".$b['db'].")");
				$x=$x+35;
			}

claro que há mais código antes, mas esta é a parte onde desenha o gráfico


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

nem é uma questão de precisar, o meu chefe que pediu para fazer isso para ficar mais bonito e apresentável como ele diz


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

Lol, isso só estraga os gráficos, mas enfim.

Segue em anexo um exemplo de código para cantos redondos, só tens de adaptar.

obrigado :P


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.