Ir para conteúdo
Fórum Script Brasil
  • 0

Imagem de gráfico de pizza não aparece


Edu Valente

Pergunta

Boa tarde pessoal. Estou tentando gerar um gráfico de pizza com um código mas a imagem não me é retornada. Já verifiquei duas vezes o código .inc e o .php e não achei nenhum erro de sintaxe. Eu tenho a biblioteca gd ativada e consigo gerar imagens de outros tipos (como a de uma estrela, por exemplo). Seguem abaixo os códigos e mais uma vez, obrigado.

O arquivo .inc

<?php 
  // configurações do gráfico
  $largura = 600;
  $altura = 400; 
  // configurações do círculo 
  $centrox = 200;
  $centroy = 200; 
  $diametro = 280;
  $angulo = 0;
  // configurações da legenda 
  $exibir_legenda = "sim";
  $fonte = 3;
  $largura_fonte = 8;
  $altura_fonte = 10;
  $espaco_entre_linhas = 10;
  $margem_vertical = 5;
  // canto superior direito da legenda 
  $lx = 540; 
  $ly = 30;
  
?>
O arquivo .php de geração do gráfico
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gráfico de Pizza</title>
</head>
<body>
   <?php
   header("Content-type: image/png");
   
   // inclui o arquivo com as configurações
   include 'config_grafico.inc';
   
   // cria a imagem e define as cores
   $imagem = imagecreate($largura, $altura);
   $fundo = imagecolorallocate($imagem, 236, 226, 226);
   $preto = imagecolorallocate($imagem, 0, 0, 0);
   $azul = imagecolorallocate($imagem, 0, 0, 255);
   $verde = imagecolorallocate($imagem, 0, 255, 0);
   $vermelho = imagecolorallocate($imagem, 255, 0, 0);
   $amarelo = imagecolorallocate($imagem, 255, 255, 0);
   
   // definição dos dados 
   $dados = array("Leoes", "Antilopes", "Elefantes", "Girafas");
   $valores = array(180, 540, 330, 110);
   $cores = array($azul, $verde, $vermelho, $amarelo);
   
   // cálculo do total
   $total = 0;
   $num_linhas = sizeof($dados);
   for($i = 0; $i < $num_linhas; $i++)
     $total += $valores[$i];
     
   // desenha o gráfico
   imageellipse($imagem, $centrox, $centroy, $diametro, $diametro, $preto);
   imagestring($imagem, 3, 3, 3, "Total: $total animais", $preto);
        
   $raio = $diametro / 2;
   
   for($i = 0; $i < $num_linhas; $i++)
   {
      $percentual = ($valores[$i]/$total) * 100;
      $percentual = number_format($percentual, 2);
      $percentual .= "%";
   
      $val = 360 * ($valores[$i]/$total);
      $angulo += $val;
      $angulo_meio = $angulo - ($val / 2);
      
      $x_final = $centrox + $raio * cos(deg2rad($angulo));
      $y_final = $centroy + (- $raio * sin(deg2rad($angulo)));
      
      $x_meio = $centrox + ($raio / 2 * cos(deg2rad($angulo_meio)));
      $y_meio = $centroy + (- $raio / 2 * sin(deg2rad($angulo_meio)));
      
      $x_texto = $centrox + ($raio * cos(deg2rad($angulo_meio))) * 1.2;
      $y_texto = $centroy + (- $raio * sin(deg2rad($angulo_meio))) * 1.2;
      
      imageline($imagem, $centrox, $centroy, $x_final, $y_final, $preto);
      imagefilltoborder($imagem, $x_meio, $y_meio, $preto, $cores[$i]);
      imagestring($imagem, 2, $x_texto, $y_texto, $percentual, $preto);
    }
    
    // ------ CRIAÇÃO DA LEGENDA ------
   
    if($exibir_legenda == "sim")
    {
        // acha a maior string
        $maior_tamanho = 0;
        for($i = 0; $i < $num_linhas; $i++)
          if(strlen($dados[$i]) > $maior_tamanho)
             $maior_tamanho = strlen($dados[$i]);
             
        // calcula os pontos de início e fim do quadrado
        $x_inicio_legenda = $lx - $largura_fonte * ($maior_tamanho + 4);
        $y_inicio_legenda = $ly;
        
        $x_fim_legenda = $lx;
        $y_fim_legenda = $ly + $num_linhas * ($altura_fonte + $espaco_entre_linhas) + 2 * $margem_vertical;
                                                      
        imagerectangle($imagem, $x_inicio_legenda, $y_inicio_legenda, $x_fim_legenda, $y_fim_legenda, $preto);
        
        // começa a desenhar os dados
        for($i = 0; $i < $num_linhas; $i++)
        {
            $x_pos = $x_inicio_legenda + $largura_fonte * 3;
            $y_pos = $y_inicio_legenda + $i * ($altura_fonte + $espaco_entre_linhas) + $margem_vertical;
            
            imagestring($imagem, $fonte, $x_pos, $y_pos, $dados[$i], $preto);
            imagefilledrectangle($imagem, $x_pos - 2 * $largura_fonte, $y_pos, 
                 $x_pos - $largura_fonte, $y_pos + $altura_fonte, $cores[$i]);
            imagerectangle($imagem, $x_pos - 2 * $largura_fonte, $y_pos, $x_pos - $largura_fonte, 
                 $y_pos + $altura_fonte, $preto);
        }
      }
      imagepng($imagem);
      imagedestroy($imagem);
  ?> 
 </body>
</html>

Link para o comentário
Compartilhar em outros sites

19 respostass a esta questão

Posts Recomendados

  • 0

Opa! Testei aqui, fiz algumas modificações e funcionou!

O problema é que você colocou código HTML, o que não é permitido já que você está utilizando a função header (para usar a função header, você não poderá imprimir nada na tela).

Uma outra dica, é renomear o arquivo config_grafico.inc para config_grafico.inc.php, pois se você acessar este arquivo diretamente pelo browser, ele não vai ser interpretado como PHP e sim como texto e será exibido todo o código que estiver dentro dele!

Aqui está o código:

teste.php

<?php
   
   ini_set('display_errors', 1);
   error_reporting(E_ALL);
   
   header("Content-type: image/png");
   
   // inclui o arquivo com as configurações
   include 'config_grafico.inc';
   
   // cria a imagem e define as cores
   $imagem = imagecreate($largura, $altura);
   $fundo = imagecolorallocate($imagem, 236, 226, 226);
   $preto = imagecolorallocate($imagem, 0, 0, 0);
   $azul = imagecolorallocate($imagem, 0, 0, 255);
   $verde = imagecolorallocate($imagem, 0, 255, 0);
   $vermelho = imagecolorallocate($imagem, 255, 0, 0);
   $amarelo = imagecolorallocate($imagem, 255, 255, 0);
   
   // definição dos dados 
   $dados = array("Leoes", "Antilopes", "Elefantes", "Girafas");
   $valores = array(180, 540, 330, 110);
   $cores = array($azul, $verde, $vermelho, $amarelo);
   
   // cálculo do total
   $total = 0;
   $num_linhas = sizeof($dados);
   for($i = 0; $i < $num_linhas; $i++)
     $total += $valores[$i];
     
   // desenha o gráfico
   imageellipse($imagem, $centrox, $centroy, $diametro, $diametro, $preto);
   imagestring($imagem, 3, 3, 3, "Total: $total animais", $preto);
        
   $raio = $diametro / 2;
   
   for($i = 0; $i < $num_linhas; $i++)
   {
      $percentual = ($valores[$i]/$total) * 100;
      $percentual = number_format($percentual, 2);
      $percentual .= "%";
   
      $val = 360 * ($valores[$i]/$total);
      $angulo += $val;
      $angulo_meio = $angulo - ($val / 2);
      
      $x_final = $centrox + $raio * cos(deg2rad($angulo));
      $y_final = $centroy + (- $raio * sin(deg2rad($angulo)));
      
      $x_meio = $centrox + ($raio / 2 * cos(deg2rad($angulo_meio)));
      $y_meio = $centroy + (- $raio / 2 * sin(deg2rad($angulo_meio)));
      
      $x_texto = $centrox + ($raio * cos(deg2rad($angulo_meio))) * 1.2;
      $y_texto = $centroy + (- $raio * sin(deg2rad($angulo_meio))) * 1.2;
      
      imageline($imagem, $centrox, $centroy, $x_final, $y_final, $preto);
      imagefilltoborder($imagem, $x_meio, $y_meio, $preto, $cores[$i]);
      imagestring($imagem, 2, $x_texto, $y_texto, $percentual, $preto);
    }
    
    // ------ CRIAÇÃO DA LEGENDA ------
   
    if($exibir_legenda == "sim")
    {
        // acha a maior string
        $maior_tamanho = 0;
        for($i = 0; $i < $num_linhas; $i++)
          if(strlen($dados[$i]) > $maior_tamanho)
             $maior_tamanho = strlen($dados[$i]);
             
        // calcula os pontos de início e fim do quadrado
        $x_inicio_legenda = $lx - $largura_fonte * ($maior_tamanho + 4);
        $y_inicio_legenda = $ly;
        
        $x_fim_legenda = $lx;
        $y_fim_legenda = $ly + $num_linhas * ($altura_fonte + $espaco_entre_linhas) + 2 * $margem_vertical;
                                                      
        imagerectangle($imagem, $x_inicio_legenda, $y_inicio_legenda, $x_fim_legenda, $y_fim_legenda, $preto);
        
        // começa a desenhar os dados
        for($i = 0; $i < $num_linhas; $i++)
        {
            $x_pos = $x_inicio_legenda + $largura_fonte * 3;
            $y_pos = $y_inicio_legenda + $i * ($altura_fonte + $espaco_entre_linhas) + $margem_vertical;
            
            imagestring($imagem, $fonte, $x_pos, $y_pos, $dados[$i], $preto);
            imagefilledrectangle($imagem, $x_pos - 2 * $largura_fonte, $y_pos, 
                 $x_pos - $largura_fonte, $y_pos + $altura_fonte, $cores[$i]);
            imagerectangle($imagem, $x_pos - 2 * $largura_fonte, $y_pos, $x_pos - $largura_fonte, 
                 $y_pos + $altura_fonte, $preto);
        }
    }
    imagepng($imagem);
    imagedestroy($imagem);

?>
config_grafico.inc
<?php 
  // configurações do gráfico
  $largura = 600;
  $altura = 400; 
  // configurações do círculo 
  $centrox = 200;
  $centroy = 200; 
  $diametro = 280;
  $angulo = 0;
  // configurações da legenda 
  $exibir_legenda = "sim";
  $fonte = 3;
  $largura_fonte = 8;
  $altura_fonte = 10;
  $espaco_entre_linhas = 10;
  $margem_vertical = 5;
  // canto superior direito da legenda 
  $lx = 540; 
  $ly = 30;
  
?>

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

Stoma eu tentei aqui mas não funcionou. Fiz todas as alterações que tu disseste: tirei todas as tags e renomeei o inc como config.inc.php . O que mais pode ser ? estou começando a achar que é algum problema de configuração num dos arquivos internos - como o php.ini - existe alguma variável que deve ser habilitada num desses arquivos ? eu estou usando o EasyPHP.

Editado por Edu Valente
Link para o comentário
Compartilhar em outros sites

  • 0

Hm... estranho! O que aparece para você?

O gráfico que aparece para mim é este:

graficol.th.jpg

Verifique se a biblioteca GD está ativada no seu servidor...

<?php
      phpinfo();
?>

Nas informações que aparecer, procure por 'GD Support', na frente dela é para estar escrito 'enabled'.

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

No php.ini, eu já tinha esta instrução habilitada: extension=php_gd2.dll que é a instrução que habilita o GD né ?

no Firefox aparece: " A imagem (caminho da imagem) contém erros e não pode ser exibida. "

no Chrome aparece aquele símbolo de quando a imagem não aparece.

o meu php.ini não tem a instrução "GD support" porém se eu consigo criar outras imagens (como a da estrela que citei no começo do tópico) é porque eu tenho o GD habilitado né ?

Editado por Edu Valente
Link para o comentário
Compartilhar em outros sites

  • 0

Edu,

Recentemente, estou fazendo alguns testes com a Google Charts API.

A facilidade de uso é indiscutível, você precisa somente passar os parâmetros via URL que a API se encarregar de gerar o gráfico.

Também existem várias opções de gráficos.

Vale a pena conferir.

Segue uma referencia.

http://code.google.com/intl/pt-BR/apis/chart/

Para gerar um gráfico em sua página PHP, é só passar os parâmetros do gráfico na URL.

Ex.

echo "Exemplo de gráfico gerado pelo Google Charts API: <br/>";
    echo "<img src='https://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World' />";

Abraço

Editado por Romero Dias
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela dica Romero. Já coloquei o link nos favoritos. Eu estou tentando gerar esse gráfico com o auxílio do EasyPHP porque eu transcrevi ele de um livro e estou achando muito estranho que ele não está sendo gerado mesmo com o extension do GD habilitado.

Editado por Edu Valente
Link para o comentário
Compartilhar em outros sites

  • 0

Eu tava tentando configurar o WAMP através do tutorial que o david me passou; Eu até consegui configurar configurar o Apache (num outro port sem ser o 80) mas quando eu instalei o .msi do PHP 5, o servidor do Apache deu erro dizendo "The requested operation has failed" e se eu tentar executá-lo pelo prompt, não aparece nenhuma mensagem de erro. Eu coloquei apontei o PHP para o diretório conf do Apache e também selecionei Apache 2.2 como o módulo a ser executado. Por favor David, você tem idéia de como resolver esse problema ? se nada der certo, eu vou tentar usar o XAMPP.

Editado por Edu Valente
Link para o comentário
Compartilhar em outros sites

  • 0
Sim... fez isso com os 2 arquivos php.ini (1 da pastas php e outro da pasta apache/bin)?

Sim e o pior Stoma é que já estava como tu disseste: ambos os gds já tinham vindo habilitados. Não tem mais algum lugar que seja necessário habilitar o gd ? Tentarei continuar o estudo de gráficos e espero conseguir gerar o próximo. :unsure:

haha consegui! eu deletei os dois arquivos e criei tudo do zero copiando os códigos do Stoma. E então o gráfico foi gerado usando o XAMPP! (eu eim?) O curioso que antes eu apenas deletei os códigos (sem apagar os arquivos propriamente ditos) e coloquei os códigos do Stoma. Fiquei perplexo com isso: deu certo só depois que apaguei os arquivos.

grafd.th.jpg

Pessoal, eu não teria conseguido sem vocês! muito obrigado!

Editado por Edu Valente
Link para o comentário
Compartilhar em outros sites

  • 0

kkkkkkkkkkkkk

Mistérios da meia noite!!

Qual editor PHP você usa? Em alguns editores você pode escolher a codificação do documento. No Notepad++ senão me engano vem por padrão a Codificação em ANSI ou a Codificação UTF8 sendo que na Codificação UTF8 não sei porque mas as vezes ele adiciona algo que não é visível (ou então é espaço em branco, não sei direito) que faz com que algumas funções exibam mensagens de erro (já vi várias pessoas reclamando disso quando utilizam a função session_start e recebem erro dizendo que algo já foi impresso na tela), aí nesses casos é necessário selecionar a Codifição em UTF8 (SEM BOM) e o código funciona sem problemas! Não sei, mas talvez possa ter acontecido algo neste sentido...

Mas se funcionou, então problema resolvido!

Quando precisar é só chamar ^_^

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...