Edit report at http://bugs.php.net/bug.php?id=52070&edit=1
ID: 52070
User updated by: tgabor72 at freemail dot hu
Reported by: tgabor72 at freemail dot hu
Summary: imagedashedline() - dashed line sometimes is not
visible
-Status: Open
+Status: Closed
Type: Bug
Package: GD related
Operating System: WinXP - IIS -fastcgi
PHP Version: 5.3.2
Block user comment: N
New Comment:
You can use the imagepatternedline() function with extra features
instead of imagedashedline() to give a visible dashedlines and other any
kind of patterned lines on your images. The routine also manages the
thickness of the line. Have fun!
// imagepatternedline() function
// Routine was developed to draw any kind of straight line with
thickness. Routine uses imageline() function to draw line.
// Parameters are (similar to imageline() function):
// $image: (resource) imagefile
// $xstart, $ystart: (int) x,y coordinates for first point
// $xend, $yend: (int) x,y coordinates for last point
// $color: (int) color identifier that created with
imagecolorallocate()
// extra parameters:
// $thickness: (int) thickness of line in pixel
// $pattern: (string) pattern of line, which repeats continuously
while line is being drawed.
// If there is '1' in the pattern that means the actual dot of line is
visible,
// '0' means dot is not visible (space between two line elements).
// All characters regard for one pixel. Default: 1 dot wide dashed
line with 4-4 dots and spaces.
// Examples for pattern:
// "1" or "" continuous line
// "10" close dotline
// "10000" dotline
// "111111110000001100000011111111" dotline for design drawing
// "111111111100000011000000110000001111111111" double dotline
// some examples for using imagepatternedline():
// imagepatternedline($image,300,300,442,442,$color,200,""); // a square
with 200 length of edge and rotated 45 degrees
// imagepatternedline($image,100,200,289,200,$color,100,
// "11001100000011001111000011001111110000001100001100"
// ."00001111001100111100000011000000110000110011001100"
// ."11000011111100111111000011001111001111000011110000"
// ."1111001111110011000011000000001100110011"); // barcode
function imagepatternedline($image, $xstart, $ystart, $xend, $yend,
$color, $thickness=1, $pattern="11000011") {
$pattern=(!strlen($pattern)) ? "1" : $pattern;
$x=$xend-$xstart;
$y=$yend-$ystart;
$length=floor(sqrt(pow(($x),2)+pow(($y),2)));
$fullpattern=$pattern;
while (strlen($fullpattern)<$length) $fullpattern.=$pattern;
if (!$length) {
if ($fullpattern[0]) imagefilledellipse($image, $xstart, $ystart,
$thickness, $thickness, $color);
return;
}
$x1=$xstart;
$y1=$ystart;
$x2=$x1;
$y2=$y1;
$mx=$x/$length;
$my=$y/$length;
$line="";
for($i=0;$i<$length;$i++){
if (strlen($line)==0 or $fullpattern[$i]==$line[0]) {
$line.=$fullpattern[$i];
}else{
$x2+=strlen($line)*$mx;
$y2+=strlen($line)*$my;
if ($line[0]) imageline($image, round($x1), round($y1),
round($x2-$mx), round($y2-$my), $color);
$k=1;
for($j=0;$j<$thickness-1;$j++) {
$k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;
$k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;
$k=1-$k;
if ($line[0]) {
imageline($image, round($x1)+$k1, round($y1)+$k2,
round($x2-$mx)+$k1, round($y2-$my)+$k2, $color);
if ($y) imageline($image, round($x1)+$k1+1,
round($y1)+$k2, round($x2-$mx)+$k1+1, round($y2-$my)+$k2, $color);
if ($x) imageline($image, round($x1)+$k1,
round($y1)+$k2+1, round($x2-$mx)+$k1, round($y2-$my)+$k2+1, $color);
}
}
$x1=$x2;
$y1=$y2;
$line=$fullpattern[$i];
}
}
$x2+=strlen($line)*$mx;
$y2+=strlen($line)*$my;
if ($line[0]) imageline($image, round($x1), round($y1), round($xend),
round($yend), $color);
$k=1;
for($j=0;$j<$thickness-1;$j++) {
$k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;
$k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;
$k=1-$k;
if ($line[0]) {
imageline($image, round($x1)+$k1, round($y1)+$k2,
round($xend)+$k1, round($yend)+$k2, $color);
if ($y) imageline($image, round($x1)+$k1+1, round($y1)+$k2,
round($xend)+$k1+1, round($yend)+$k2, $color);
if ($x) imageline($image, round($x1)+$k1, round($y1)+$k2+1,
round($xend)+$k1, round($yend)+$k2+1, $color);
}
}
}
Previous Comments:
------------------------------------------------------------------------
[2010-06-13 00:28:12] tgabor72 at freemail dot hu
Description:
------------
This bug first was realized by me in php 5.3.1. imagedashedline()
function is not work properly. Tipically horizontal and sharp-angled
dashed lines is not visible after running this function. Could someone
make a patch or fix this problem?
I know this problem has already been realized in earlier versions also,
but not corrected yet.
Thanks,
Gabor
Test script:
---------------
$im=imagecreate(1200,800);
$background_color=imagecolorallocate($im,40,40,40);
$color=imagecolorallocate($im,255,255,255);
imagedashedline($im,800,400,300,400,$color); // not visible, horizontal
line
imagedashedline($im,800,400,300,800,$color); // not visible
imagedashedline($im,800,400,400,800,$color); // not visible
imagedashedline($im,800,400,500,800,$color); // visible
imagedashedline($im,800,400,600,800,$color); // visible
imagedashedline($im,800,400,700,800,$color); // visible
imagedashedline($im,800,400,800,800,$color); // visible, vertical line
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=52070&edit=1