Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

gd rectangulos com cantos redondos

Mensagens Recomendadas

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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.