显然,如果将抗锯齿设置为 true,则 imagesetthickness 无法正常工作。
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
imagesetthickness — 设置线条绘制的粗细
imagesetthickness() 设置绘制矩形、多边形、圆弧等图形时线条的粗细,以像素为单位。
示例 #1 imagesetthickness() 示例
<?php
// 创建一个 200x100 的图像
$im = imagecreatetruecolor(200, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
// 将背景设置为白色
imagefilledrectangle($im, 0, 0, 299, 99, $white);
// 将线条粗细设置为 5
imagesetthickness($im, 5);
// 绘制矩形
imagerectangle($im, 14, 14, 185, 85, $black);
// 将图像输出到浏览器
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
上面的示例将输出类似于
感谢 circle14,
只需更改该行,即可解决我们需要的椭圆问题
while ($line < $thickness) {
$line++;
$elipse_w--;
imageellipse($image, $pos_x, $pos_y, $elipse_w, $elipse_h, $color);
$elipse_h--;
}
更糟的一点是,imagesetthikness() 对您绘制的下一个对象有效。
例如:您可以使用 1 的粗细在图表中绘制网格
通过调用 imagesetthickness($image, 1);
... 绘制网格的脚本...
然后使用 3 的粗细绘制图表线
imagesetthickness($image, 3);
... 绘制图表线的脚本...
希望这有帮助...
一种更容易管理粗细的方法是在绘制椭圆之前使用两种不同颜色的椭圆
<?php
imagefilledellipse ($this->image,60,42,57,57,$drawColor);
imagefilledellipse ($this->image,60,42,45,45,$backColor);
?>
第一行绘制一个用所需颜色填充的椭圆,第二行绘制一个从同一个中心点开始,但更小的用背景颜色填充的椭圆。
这种方法的缺点是您会擦除椭圆中间的所有内容。
正如您在示例图像中看到的,左右两侧比它们应该的宽 1 像素,对于任何宽度 > 1 都是如此。
编写了此函数来修复该部分。虽然可能不是直接的替换。它会围绕给定的坐标绘制一个矩形,以适应任何宽度的线条。
<?php
// 在给定坐标周围绘制一条宽度为 $width 的线,记住 0,0,1,1 会生成一个 2×2 的正方形
function imagelinerectangle($img, $x1, $y1, $x2, $y2, $color, $width=1) {
imagefilledrectangle($img, $x1-$width, $y1-$width, $x2+$width, $y1-1, $color);
imagefilledrectangle($img, $x2+1, $y1-$width, $x2+$width, $y2+$width, $color);
imagefilledrectangle($img, $x1-$width, $y2+1, $x2+$width, $y2+$width, $color);
imagefilledrectangle($img, $x1-$width, $y1-$width, $x1-1, $y2+$width, $color);
}
?>
这是一个我写的自定义函数,它解决了椭圆线粗细问题
<?php
function draw_oval ($image, $pos_x, $pos_y, $elipse_width, $elipse_height, $color, $px_thick) {
$line = 0;
$thickness = $px_thick;
$elipse_w = $elipse_width;
$elipse_h = $elipse_height;
while ($line < $thickness) {
imageellipse($image, $pos_x, $pos_y, $elipse_w, $elipse_h, $color);
$line++;
$elipse_w--;
$elipse_h--;
}
}
?>
我希望你觉得它有用。
imagesetthickness 在 imagerectangle() 中的工作方式非常奇怪。
<?php
imagesetthickness(1);
imagerectangle($im, 10, 10, 50, 50, $red);
?>
这将绘制一个 41x41 的正方形(因为 gd 需要包含右下角像素。50 应该被替换为 49)。这将类似于
<?php
imageline($im, 10, 10, 10, 50, $red);
imageline($im, 10, 10, 50, 10, $red);
imageline($im, 50, 10, 50, 50, $red);
imageline($im, 10, 50, 50, 50, $red);
?>
第二个例子
<?php
imagesetthickness(2);
imagerectangle($im, 10, 10, 50, 50, $red);
?>
这将绘制一个 43x43 的正方形,因为边框(粗细)设置为 2。*但是* 这不是围绕原始 41x41 正方形的 2 像素的“正常”边框!
在左侧和右侧,粗细将为 3,而在顶部和底部,粗细将为 2。
如果你采用 imageline 示例,但事先将粗细设置为 2,这将*几乎*达到预期效果:正方形的最左侧像素将不会被绘制。
总结
1) 不要忘记绘制的矩形的(宽度,高度)为(x2-x1+1,y2-y1+1)
2) 粗细在矩形上的实现很糟糕(或者至少,行为没有记录),因为左右粗细并非预期值。
3) 4*imageline() 应该可以解决问题,但在“修补”左上角像素后。