PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

imagefilledellipse> <imagefill
Last updated: Fri, 14 Nov 2008

view this page in

imagefilledarc

(PHP 4 >= 4.0.6, PHP 5)

imagefilledarcDessine une ellipse partielle et la remplit

Description

bool imagefilledarc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color , int $style )

Dessine une ellipse partielle, centrée aux coordonnées spécifiées dans l'image fournie.

Liste de paramètres

image

Une ressource d'image, retourné par une des fonctions de création d'images, comme imagecreatetruecolor().

cx

X : coordonnée du centre

cy

Y : coordonnée du centre

width

La largeur de l'arc

height

La hauteur de l'arc

start

L'angle de début de l'arc, en degrés

end

L'angle de fin de l'arc, en degrés. 0° est situé à une position de 3 heures sur un cadran horaire, et l'arc est dessiné dans le sens des aiguilles d'une montre.

color

Un identifiant de couleur, créé par la fonction imagecolorallocate()

style

Un champ d'octets, combiné avec l'opérateur OR :

  1. IMG_ARC_PIE
  2. IMG_ARC_CHORD
  3. IMG_ARC_NOFILL
  4. IMG_ARC_EDGED
IMG_ARC_PIE et IMG_ARC_CHORD sont mutuellement exclusives; IMG_ARC_CHORD ne fait que connecter les angles de début et de fin avec une ligne droite, tandis que IMG_ARC_PIE produit une ligne courbe. IMG_ARC_NOFILL indique que l'arc (ou corde) doit être dessiné mais pas rempli. IMG_ARC_EDGED, utilisé conjointement avec IMG_ARC_NOFILL, indique que les angles de début et de fin doivent être connectés au centre. Cette fonction est recommandée pour faire les graphiques de type camembert.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Création d'un camembert en 3D

<?php

// Création de l'image
$image imagecreatetruecolor(100100);

// Allocation de quelques couleurs
$white    imagecolorallocate($image0xFF0xFF0xFF);
$gray     imagecolorallocate($image0xC00xC00xC0);
$darkgray imagecolorallocate($image0x900x900x90);
$navy     imagecolorallocate($image0x000x000x80);
$darknavy imagecolorallocate($image0x000x000x50);
$red      imagecolorallocate($image0xFF0x000x00);
$darkred  imagecolorallocate($image0x900x000x00);

// Création de l'effet 3D
for ($i 60$i 50$i--) {
   
imagefilledarc($image50$i10050045$darknavyIMG_ARC_PIE);
   
imagefilledarc($image50$i100504575 $darkgrayIMG_ARC_PIE);
   
imagefilledarc($image50$i1005075360 $darkredIMG_ARC_PIE);
}

imagefilledarc($image505010050045$navyIMG_ARC_PIE);
imagefilledarc($image5050100504575 $grayIMG_ARC_PIE);
imagefilledarc($image50501005075360 $redIMG_ARC_PIE);


// Affichage de l'image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Notes

Note: Cette fonction requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommandée).



imagefilledellipse> <imagefill
Last updated: Fri, 14 Nov 2008
 
add a note add a note User Contributed Notes
imagefilledarc
Mike
14-Aug-2007 09:43
The previous example does not work well.  This is much better and faster:

<?php
$Randomized
= rand(1,20);
for(
$i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='600';$imgy='400';//Set Image Size. ImageX,ImageY
$cx = '300';$cy ='150'; //Set Pie Postition. CenterX,CenterY
$sx = '600';$sy='300';$sz ='100';// Set Size-dimensions. SizeX,SizeY,SizeZ

$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
  
$angle[$i] = (($data[$i] / $data_sum) * 360);
  
$angle_sum[$i] = array_sum($angle);
};
$im  = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
  
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);  
  
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
  
$colord[$i] = imagecolorallocate($im,($r/1.5),($g/1.5),($b/1.5));
}
//3D effect.
for($z=1;$z<=$sz;$z++){
       
// first slice
   
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,0
   
,$angle_sum[0],$colord[0],IMG_ARC_EDGED);
   for(
$i=1;$i<=$Randomized;$i++){
       
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
        ,
$angle_sum[$i],$colord[$i],IMG_ARC_NOFILL);
   };
};
//Top pie.
   // first slice
  
imagefilledarc($im,$cx,$cy,$sx,$sy,0 ,$angle_sum[0], $colors[0], IMG_ARC_PIE);
for(
$i=1;$i<=$Randomized;$i++){
  
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
imazir at gmail dot com
31-Jan-2006 11:53
The previous example does not work. Try those modifications and you will have the expected results :

<?
$Randomized
= rand(1,20);
for(
$i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='200';$imgy='200';//Set Image Size. ImageX,ImageY
$cx = '100';$cy ='50'; //Set Pie Postition. CenterX,CenterY
$sx = '200';$sy='100';$sz ='20';// Set Size-dimensions. SizeX,SizeY,SizeZ

$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
  
$angle[$i] = (($data[$i] / $data_sum) * 360);
  
$angle_sum[$i] = array_sum($angle);
};
$im  = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
  
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);   
  
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
  
$colord[$i] = imagecolorallocate($im,($r/2),($g/2),($b/2));
}
//3D effect.
for($z=1;$z<=$sz;$z++){
   for(
$i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,
$angle_sum[$i],$colord[$i],IMG_ARC_PIE);
   };
};
//Top pie.
for($i=1;$i<=$Randomized;$i++){
  
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Byron at theworks dot net dot nz
11-Oct-2005 08:52
try this,
<?
$Randomized
= rand(1,20);
for(
$i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='200';$imgy='200';//Set Image Size. ImageX,ImageY
$cx = '100';$cy ='50'; //Set Pie Postition. CenterX,CenterY
$sx = '200';$sy='100';$sz ='20';// Set Size-dimensions. SizeX,SizeY,SizeZ

$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
   
$angle[$i] = (($data[$i] / $data_sum) * 360);
   
$angle_sum[$i] = array_sum($angle);
};
$im  = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
   
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);   
   
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
   
$colord[$i] = imagecolorallocate($im,($r/2),($g/2),($b/2));
}
//3D effect.
for($i=0;$z<=$sz;$z++){
    for(
$i=0;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,
$angle_sum[$i],$colord[$i],IMG_ARC_PIE);
    };
};
//Top pie.
for($i=0;$i<=$Randomized;$i++){
   
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
paulcharltonthomson at hotmail dot com
02-Jul-2005 08:00
Here's a slightly better way to get the colours for the pie chart shaded wall as posted by double-zonk at wp dot pl

<?php

$rgb0
= array (255, 153, 204);
$rgb1 = array (255, 153, 0);
$rgb2 = array (153, 204, 0);
$rgb3 = array (51, 153, 102);
$rgb4 = array (51, 204, 204);
$rgb5 = array (51, 102, 255);
$rgb6 = array (128, 0, 128);
$rgb7 = array (150, 150, 150);

for (
$r = 0; $r < 8; ++$r)
    {
        if(${
"rgb" . $r}[0] < 50) $shadowr = 0; else $shadowr = ${"rgb" . $r}[0] - 50;
        if(${
"rgb" . $r}[1] < 50) $shadowg = 0; else $shadowg = ${"rgb" . $r}[1] - 50;
        if(${
"rgb" . $r}[2] < 50) $shadowb = 0; else $shadowb = ${"rgb" . $r}[2] - 50;
        ${
"wall" . $r} = array ($shadowr, $shadowg, $shadowb);
    }

for (
$s = 0; $s < 8; ++$s)
    {
       
$kolor[$s] = imagecolorallocate($image, ${"rgb" . $s}[0], ${"rgb" . $s}[1], ${"rgb" . $s}[2]);
       
$cien[$s] = imagecolorallocate($image, ${"wall" . $s}[0], ${"wall" . $s}[1], ${"wall" . $s}[2]);
    }

?>
04-Jun-2005 09:25
For 3D-graphs you will want to have a nice shadow. Here is an easy wat to calculate a good matching shadow to a color.
$color is the color for the pie-piece above, $shadow_color is the shadow under it.

<?php

$mask
= 0; //0 for darker, 255 for brighter
$percent = 0.70; //between 0.40 (very different) and 0.99 (almost the same)

$R = rand(0, 124); // } between 0,124 if your background color is white
$G = rand(0, 124); // } between 124,255 if your background color is black
$B = rand(0, 124); // } or play with these values

$RS = round($R * $percent) + round($mask * (1-$percent));
$GS = round($G * $percent) + round($mask * (1-$percent));
$BS = round($B * $percent) + round($mask * (1-$percent));

$color = imagecolorallocate( $im, $R, $G, $B);
$shadow_color = imagecolorallocate( $im, $RS, $GS, $BS);

?>
t_therkelsen at hotmail dot com
08-Mar-2005 10:21
Note that imageFilledArc() and imageArc() both take ints as degree measurements.  This is no problem if you're *only* using imageArc() and/or imageFilledArc().  However, if you're using calculated degrees and plan to superimpose other drawing elements (eg., you want to make vertical lines between the shadow 3D effect) you need to floor() your degrees before converting them to radians, otherwise you'll get precision errors.

A small example illustrating the 'feature'...

<?php
$img
= imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);

$sd = 45.5;
$ed = 130.5;

imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
              
$front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);

imageLine($img,
         
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
         
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
         
$front);
imageLine($img,
         
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
         
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
         
$front);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>

And this is how it should be...

<?php
$img
= imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);

$sd = floor(45.5);
$ed = floor(130.5);

imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
              
$front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);

imageLine($img,
         
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
         
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
         
$front);
imageLine($img,
         
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
         
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
         
$front);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
rich at dicksonlife dot com
24-Sep-2004 04:22
Even more efficiency:

The original code snippet and the following suggestions are inefficient in that they rely on the overlying php to fill vertically using loops rather than taking advantage of the underlying drawing routines. Also, this is done by repeatedly drawing filled partial elipses and circular calculations are typically expensive (PHP may use tables, I'm not sure) The original code could be rewritten as

<?php
// Add the bottom layer.
 
imagefilledarc($image, 50, 60, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
 
imagefilledarc($image, 50, 60, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
 
imagefilledarc($image, 50, 60, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);

//Now do the joining pieces.
//Note: Precompute cosines and sines for efficiency
 
$c1=50*cos(45/180*M_PI);
 
$s1=25*sin(45/180*M_PI);
 
$c2=50*cos(75/180*M_PI);
 
$s2=25*sin(75/180*M_PI);

 
$area1=array(100,60,100,50,50+$c1,50+$s1,50+$c1,60+$s1);
 
$area2=array(50+$c1,50+$s1,50+$c1,60+$s1,50+$c2,60+$s2,50+$c2,50+$s2);
//Note that piece 3 goes round the corner. So we are only interested in the leftmost extent. You would need to do this programatically. Also, you do not need to make vertical parts for any segments completely at the back of the pie (in fact, not filledarcs either)
 
$area3=array(50+$c2,50+$s2,50+$c2,60+$s2,0,60,0,50);

 
imagefilledpolygon($image, $area1 , 4 , $darknavy);
 
imagefilledpolygon($image, $area2 , 4 , $darkgray);
 
imagefilledpolygon($image, $area3 , 4 , $darkred);

 
imagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
 
imagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
 
imagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);
?>

Note that the polygons are perhaps slightly inefficient. If there was an imagefilledtriangle, this code would be simpler. Given how fundamental triangles are, perhaps for a future version?

Rich
micha _a.t_ psytrance _d.o.t_ info
09-Sep-2004 04:09
for nice colors and adapted shadows from amount of values i try:

<?php
function _errechne_gradzahlen( $werte ) {         /* calc degrees */   
   
foreach( $werte as $wert ) { $sum += $wert; }
    foreach(
$werte as $wert ) { $gradzahlen[] = 360 * ( $wert / $sum ); }
    return
$gradzahlen;
}

function
_randomcol ( $im ) {
    return
imagecolorallocate( $im, rand(100, 224), rand(100, 224), rand(128, 224) );       
}

$values = array( 100, 200, 50, 100, 43, 32 );    /* the data to display ( real values ) */
$werte = _errechne_gradzahlen( $values );        /* degrees-array */
$width = 200;
$height = 200;
$half_width = floor( $width / 2 );
$half_height = floor($height / 2);

$im = ImageCreateTrueColor( $width, $height );

foreach(
$werte as $key => $wert ) {
   
/* get colors and shadows */
   
$color = _randomcol( $im );                
   
$shadow = $color - 20000;                 // or brighter shadows take 10000
   
$colors[] = $color;
   
$shadows[] = $shadow;
/* 3D effekt */
    
for ($i = ($half_height + 10); $i > $half_height; $i--) {
       
imagefilledarc(
                   
$im,
                   
$half_width$i,        
                   
$width, $half_height,
                   
$offset, ($offset + $wert),   // from, to (degrees)
                   
$shadows[$key], IMG_ARC_NOFILL);
    }
   
$offset = $offset + $wert;
}
$offset = 0;

foreach(
$werte as $key => $wert ) {             /* an now draw the top */
   
imagefilledarc(
               
$im,
               
$half_width, $half_width,
               
$width, $half_height,           // half sized
               
$offset, ($offset + $wert),
               
$colors[$key], IMG_ARC_PIE);
   
$offset = $offset + $wert;
}
header( "Content-type: image/png" );
imagepng ( $im );
imagedestroy( $im );
?>

sry for my crab english and the disordered code, i cut and 'translate' it from a class i wrote before.
poopie
06-Aug-2004 06:08
The examples given so far for drawing a 3D looking pie chart are extremely inefficient and can give a huge performance hit to scripts that draw a lot of pies and in particular those that do offline processing on disk, rather than send a single pie chart to the browser (either way this modification saves you a lot of CPU cycles).

Modify the portion of the code that creates the 3D effect to only draw the outline (with IMG_ARC_NOFILL) of the pie layers below the top filled pie:

// make the 3D effect (modified for the original example)
for ($i = 60; $i >= 50; $i--) {
   imagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_NOFILL);
  imagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_NOFILL);
  imagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_NOFILL);
}

Note the >= on the for loop, which fills in a gap that is created without the =
hans at lintoo dot dk
17-Jul-2004 09:14
I found some bugs in my script.. and therefore I am posting the fixes:
Bugs:
<?php
$drakcolor
[2] = imagecolorallocate($im, 139, 0, 1);
//Should be
$darkcolor[2] = imagecolorallocate($im, 139, 0, 1);
?>

And then if you modify the code a little and, then make a image 200x125 then you won't be wasting space.
Changes:
<?php
$im 
= imagecreate (200, 125);
// AND
for ($i = 60; $i > 50; $i--) {
   
imagefilledarc($im, 100, $i, 200, 100, $anglesum[$f], $anglesum[$n], $darkcolor[$f], IMG_ARC_PIE);
}
// AND
      
imagefilledarc($im, 100, 50, 200, 100, $anglesum[$n], $anglesum[$i], $randcolor[$n], IMG_ARC_PIE);
?>
you can see a online demo at: http://webstatistik.lintoo.dk/
hans at lintoo dot dk
17-Jul-2004 12:27
I modificed the code to make a 3d pie from data collected elsewhere.... in this case it was for a statistics page...

when testing you can use:

enjoy

<?php
//Making a image 200 x 200
$im  = imagecreate (200, 200);

//Setting background color
$background = imagecolorallocate($im, 226, 226, 226);

//Setting colors of elements
$randcolor[0] = imagecolorallocate($im, 255, 203, 3);
$randcolor[1] = imagecolorallocate($im, 220, 101, 29);
$randcolor[2] = imagecolorallocate($im, 189, 24, 51);
$randcolor[3] = imagecolorallocate($im, 214, 0, 127);
$randcolor[4] = imagecolorallocate($im, 98, 1, 96);
$randcolor[5] = imagecolorallocate($im, 0, 62, 136);
$randcolor[6] = imagecolorallocate($im, 0, 102, 179);
$randcolor[7] = imagecolorallocate($im, 0, 145, 195);
$randcolor[8] = imagecolorallocate($im, 0, 115, 106);
$randcolor[9] = imagecolorallocate($im, 178, 210, 52);
$randcolor[10] = imagecolorallocate($im, 137, 91, 74);
$randcolor[11] = imagecolorallocate($im, 82, 56, 47);

//Setting the darker alt color to the main color
$darkcolor[0] = imagecolorallocate($im, 205, 153, 0);
$darkcolor[1] = imagecolorallocate($im, 170, 51, 0);
$drakcolor[2] = imagecolorallocate($im, 139, 0, 1);
$darkcolor[3] = imagecolorallocate($im, 164, 0, 77);
$darkcolor[4] = imagecolorallocate($im, 48, 0, 46);
$darkcolor[5] = imagecolorallocate($im, 0, 12, 86);
$darkcolor[6] = imagecolorallocate($im, 0, 52, 129);
$darkcolor[7] = imagecolorallocate($im, 0, 95, 145);
$darkcolor[8] = imagecolorallocate($im, 0, 65, 56);
$darkcolor[9] = imagecolorallocate($im, 128, 160, 2);
$darkcolor[10] = imagecolorallocate($im, 87, 41, 24);
$darkcolor[11] = imagecolorallocate($im, 32, 6, 0);

//Getting the data from GET
$i = 0;
while (
$i <= 11) {
$data[$i] = $_GET[++$i];
}

//Getting ready
$datasum = array_sum($data);
$anglesum[0] = 0;
$angle[0] = 0;
$i = 0;

//Calc the start and end angle position of the elements
while ($i <= 11) {
    ++
$i;
   
$n =