This GD example program demonstrates the code for an example program that demonstrates how to draw antialiased circles with GD and create a png image.
<?php
function SmoothCircle(&$qrImage, $dCX, $dCY, $dCR, $caColor, $iLineWidth) {
// The alpha channel is between 0 (full) and 127 (transparent).
// Pixels are centered at integer values.
// Get the image size
$iWidth = ImageSX($qrImage);
$iHeight = ImageSY($qrImage);
$dOuterRadius = $dCR + ($iLineWidth/2);
$dInnerRadius = $dCR - ($iLineWidth/2);
// A constant filter kernal seems to work best.
$iaWeights = Array(2,2,2,2,2);
$iMaxWeight = 0;
for ($iXW = 0; $iXW < 5; ++$iXW) {
for ($iYW = 0; $iYW < 5; ++$iYW) {
$iMaxWeight += $iaWeights[$iXW]*$iaWeights[$iYW];
}
}
for ($i = 0; $i < $iWidth; ++$i) {
for ($j = 0; $j < $iHeight; ++$j) {
// Filter indices
// Weight Locations: -.4, -.2, 0, .2, .4
$iWeight = 0;
for ($iXF = 0; $iXF < 5; ++$iXF) {
for ($iYF = 0; $iYF < 5; ++$iYF) {
$dX = $i + .2*$iXF - .4;
$dY = $j + .2*$iYF - .4;
$dDX = $dCX - $dX;
$dDY = $dCY - $dY;
$dDist = sqrt($dDX*$dDX + $dDY*$dDY);
if (($dDist <= $dOuterRadius) && ($dDist >= $dInnerRadius)) {
$iWeight += $iaWeights[$iXF]*$iaWeights[$iYF];
}
}
}
// Get the current pixel index
if ($iWeight != 0) {
// Reweight using a semicircle to approximate logarithmic response
// Use a semicircle response curve x/w = y^2/w^2 --> y = sqrt(w*x)/w
$dPixel = ImageColorExactAlpha($qrImage, $caColor[ 'R' ], $caColor[ 'G' ],
$caColor[ 'B' ], ( 127 - 127*sqrt($iMaxWeight*$iWeight)/$iMaxWeight));
ImageSetPixel($qrImage, $i, $j, $dPixel);
}
}
}
}
$qImage = ImageCreateTrueColor(320, 240);
SmoothCircle($qImage, 160, 120, 100, Array( 'R' => 0xFF, 'G' => 0x0, 'B' => 0x0 ), 5.5);
SmoothCircle($qImage, 170, 150, 75, Array( 'R' => 0xFF, 'G' => 0xFF, 'B' => 0x0 ), .25);
Header('Content-Type: image/png');
ImagePNG($qImage);
ImageDestroy($qImage);
?>
© 20072025 XoaX.net LLC. All rights reserved.