The bug reported by 'michi at marel dot at' also exists in PHP version 5.1.1. This functions just works with vertical lines!(PHP 4, PHP 5, PHP 7, PHP 8)
imagedashedline β Π ΠΈΡΡΠ΅Ρ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ
$image,$x1,$y1,$x2,$y2,$colorΠ€ΡΠ½ΠΊΡΠΈΡ ΡΡΡΠ°ΡΠ΅Π»Π°. ΠΠΌΠ΅ΡΡΠΎ Π½Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ imagesetstyle() ΠΈ imageline(). Π’ΠΎΡΠΊΠ° Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ 0, 0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π²Π΅ΡΡ Π½Π΅ΠΌΡ Π»Π΅Π²ΠΎΠΌΡ ΡΠ³Π»Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
imagex1ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ° Π½Π°ΡΠ°Π»Π° ΠΎΡΡΠ΅Π·ΠΊΠ° ΠΏΠΎ ΠΎΡΠΈ x.
y1ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ° Π½Π°ΡΠ°Π»Π° ΠΎΡΡΠ΅Π·ΠΊΠ° ΠΏΠΎ ΠΎΡΠΈ y.
x2ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠ° ΠΎΡΡΠ΅Π·ΠΊΠ° ΠΏΠΎ ΠΎΡΠΈ x.
y2ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠ° ΠΎΡΡΠ΅Π·ΠΊΠ° ΠΏΠΎ ΠΎΡΠΈ y.
colorΠ¦Π²Π΅Ρ Π»ΠΈΠ½ΠΈΠΈ. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° Π² ΠΏΠ°Π»ΠΈΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ imagecolorallocate().
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true.
| ΠΠ΅ΡΡΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| 8.0.0 |
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ image ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ GdImage;
ΡΠ°Π½ΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π» ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ gd-ΡΠ΅ΡΡΡΡ (resource).
|
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ imagedashedline()
<?php
// Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 100 Π½Π° 100 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ
$im = imagecreatetruecolor(100, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
// Π ΠΈΡΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ
imagedashedline($im, 50, 25, 50, 75, $white);
// Π‘ΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
imagepng($im, './dashedline.png');ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π°:
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ imagedashedline()
<?php
// Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 100 Π½Π° 100 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ
$im = imagecreatetruecolor(100, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
// ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΡΠΈΠ»Ρ: ΠΏΠ΅ΡΠ²ΡΠ΅ 4 ΠΏΠΈΠΊΡΠ΅Π»Ρ Π±Π΅Π»ΡΠ΅, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ 4 β ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠ΅.
// Π§Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ΅ΠΊΡ ΠΏΡΠ½ΠΊΡΠΈΡΠ°
$style = array(
$white,
$white,
$white,
$white,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT
);
imagesetstyle($im, $style);
// Π ΠΈΡΡΠ΅ΠΌ ΠΏΡΠ½ΠΊΡΠΈΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ
imageline($im, 50, 25, 50, 75, IMG_COLOR_STYLED);
// Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
imagepng($im, './imageline.png');The bug reported by 'michi at marel dot at' also exists in PHP version 5.1.1. This functions just works with vertical lines!It doesn't work for horizontal lines. Use imagesetstyle()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!
<?php
// 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);
}
}
}
?>I make my own dashedline:
<?
for($l=50;$l<=550;$l+=5)
{
if($da == 0) { $da = 1; }
elseif($da == 1){
imageline($bild,$l,50,$l+5,50,$green);
$da = 0; }
}
?>
$l is the x-value
and we have a dashed line :)There's a bug till PHP 4.0.4 in this function. You can only draw vertical dashed lines. To draw other dashed lines you can set <ImageSetStyle> to a special dashed line and draw it by <ImageLine>.
Sample code:
<?php
function MDashedLine($image, $x0, $y0, $x1, $y1, $fg, $bg)
{
$st = array($fg, $fg, $fg, $fg, $bg, $bg, $bg, $bg);
ImageSetStyle($image, $st);
ImageLine($image, $x0, $y0, $x1, $y1, IMG_COLOR_STYLED);
}
?>