如何使用php的gd库画一条抗锯齿的粗斜线?

luojxun 2012-05-08 09:36:47
如题,使用多边形画的填充图是有锯齿的。imageantialias函数是无效的。
...全文
477 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yijian5220 2012-05-08
  • 打赏
  • 举报
回复
JS有现成的插件 做出来的很漂亮。。。用PHP干嘛
xuzuning 2012-05-08
  • 打赏
  • 举报
回复
好无聊啊,最终是用 js 实现的
xuzuning 2012-05-08
  • 打赏
  • 举报
回复
他是扰码加密的,有空研究一下
luojxun 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

点阵图有锯齿是必然的
imageantialias 的抗锯齿是有作用的,你可以对比他打开和关闭时的效果
如果你对 imageantialias 的效果不满意(毕竟GD不是专业的图像处理包),那就要你自己编程解决了
[/Quote]
imageantialias 的抗锯齿没有作用,当你用imagefilledpolygon时。
我看phpChart这个商业的报表现实得挺好,就不知道它是怎么实现的
xuzuning 2012-05-08
  • 打赏
  • 举报
回复
点阵图有锯齿是必然的
imageantialias 的抗锯齿是有作用的,你可以对比他打开和关闭时的效果
如果你对 imageantialias 的效果不满意(毕竟GD不是专业的图像处理包),那就要你自己编程解决了
  • 打赏
  • 举报
回复
现在的ChartDirector有破解版,里面有个封装好的函数库:phpchartdir.php。直接用就行了。
xuzuning 2012-05-08
  • 打赏
  • 举报
回复
给你一个早年写的代码,供参考
<?php
//error_reporting(E_ALL ^ E_NOTICE);

class Graph {
/**
* 伪3D绘图类
*/
var $im;
var $type = "gif"; // png,gif,jpeg,wbmp
var $xo;
var $yo;
var $color;
var $fillcolor;
var $filldarkcolor;
var $filltype = true;
var $orgx;
var $orgy;
var $viewx;
var $viewy;
var $winx;
var $winy;
var $extx = 1;
var $exty = -1;
var $ksin;
var $kcos;

function Graph() {
if(func_num_args() == 2)
$this->create(func_get_arc(0),func_get_arc(1));
else
$this->create(400,300);
}
/**
* 在($x,$y)处画点
*/
function pixel($x,$y) {
$p = $this->get_view($x,$y);
imagesetpixel($this->im,$p['x'],$p['y'],$this->color);
$this->xo = $p['x'];
$this->yo = $p['y'];
}
/**
* 移动到($x,$y)处
*/
function moveto($x,$y) {
$p = $this->get_view($x,$y);
$this->xo = $p['x'];
$this->yo = $p['y'];
}
/**
* 从($x1,$y1)到($x2,$y2)处画线
*/
function line($x1,$y1,$x2,$y2) {
$p1 = $this->get_view($x1,$y1);
$p2 = $this->get_view($x2,$y2);
imageline($this->im,$p1['x'],$p1['y'],$p2['x'],$p2['y'],$this->color);
}
/**
* 从当前位置到($x,$y)处画线
*/
function lineto($x,$y) {
$p = $this->get_view($x,$y);
imageline($this->im, $this->xo, $this->yo, $p['x'], $p['y'], $this->color);
$this->xo = $p['x'];
$this->yo = $p['y'];
}
/**
* 设置当前颜色
*/
function color($clr) {
$r = ($clr>>16) & 0xff;
$g = ($clr>>8) & 0xff;
$b = ($clr) & 0xff;
$this->color = ImageColorAllocate($this->im, $r,$g,$b);
$this->fillcolor = ImageColorAllocate($this->im, $r,$g,$b);
$this->filldarkcolor = ImageColorAllocate($this->im, $r/2,$g/2,$b/2);
return $this->color;
}
/**
* 设置当前充填颜色
*/
function fillcolor($clr) {
$r = ($clr>>16) & 0xff;
$g = ($clr>>8) & 0xff;
$b = ($clr) & 0xff;
$this->fillcolor = ImageColorAllocate($this->im, $r,$g,$b);
return $this->fillcolor;
}
/**
* 创建GD句柄并设置坐标系
*/
function create($x,$y) {
$this->im = imagecreatetruecolor($x,$y);
imageantialias($this->im, 1);
imagefill($this->im, 0, 0, $this->color(0xffffff));
$this->viewx = $x-1;
$this->viewy = -($y-1);
$this->winx = $x;
$this->winy = $y;
$this->orgx = 0;
$this->orgy = 0;//$y;
$this->colors = $this->color(0xffffff);

settype($this->ksin,"double");
settype($this->kcos,"double");
$this->ksin = sin(deg2rad(0));
$this->kcos = cos(deg2rad(0));
}
/**
* 坐标映射
*/
function get_view($x,$y) {
$this->xo = $x*$this->kcos - $y*$this->ksin;
$this->yo = $x*$this->ksin + $y*$this->kcos;
$p['x'] = ($this->xo + $this->orgx)*($this->viewx/$this->winx);
$p['y'] = ($this->yo + $this->orgy)*($this->viewy/$this->winy)-$this->viewy;
return $p;
}
/**
* 设置限度
*/
function set_ext($x,$y=0) {
$this->winx = $x;
if($y == 0) {
$this->winy = - $x * $this->viewy / $this->viewx;
}else {
$this->winy = $y;
}
}
/**
* 设置旋转角
*/
function set_r($p) {
$this->ksin = sin(deg2rad($p));
$this->kcos = cos(deg2rad($p));
}
/**
* 构造图形,必需在派生类中重载本方法
*/
function paint() {
/**
* 必需由派生类重载
* 必需包含语句 $this->create(宽度,高度);
*/
die("paint 方法必需由派生类重载!");
}
/**
* 输出图形
*/
function run() {
$this->paint();
$func = "Image".$this->type;
if(! function_exists($func)) {
$this->type = "png";
$func = "Image".$this->type;
}
Header("Content-type: image/{$this->type}");
$func($this->im);
imageDestroy($this->im);
}

/**
* 圆类图形数据生成,参数$p为坐标旋转角
*/
function get_point($ox,$oy,$w,$h,$start,$end) {
$a = $w/2;
$b = $h/2;
$rs = array();
$i = $start;
for($i=$start;$i<=$end;$i+=5) {
$n = deg2rad($i);
$x = $a*cos($n);
$y = $b*sin($n);
$p = $this->get_view($ox+$x,$oy+$y);
$rs[] = $p['x'];
$rs[] = $p['y'];
if($i == $end) break;
if($i+5 > $end) $i = $end - 5;
}
$p = $this->get_view($ox,$oy);
$rs[] = $p['x'];
$rs[] = $p['y'];
$rs[] = $rs[0];
$rs[] = $rs[1];
return $rs;
}
/**
* 弓形
*/
function chord($left,$top,$w,$h,$start,$end,$z=0) {
$ar = $this->get_point($left,$top,$w,$h,$start,$end,$p);
for($i=0;$i<count($ar);$i+=2) {
$p = $this->get_view($ar[$i],$ar[$i+1]);
$ar[$i] = $p['x'];
$ar[$i+1] = $p['y'];
}
imagefilledpolygon($this->im,$ar,count($ar)/2-1,$this->fillcolor);
imagepolygon($this->im,$ar,count($ar)/2-1,$this->color);
}
/**
* 扇形
*/
function pie($left,$top,$w,$h,$start,$end,$z=0) {
$this->get_view($left,$top+$z);
$ar = $this->get_point($left,$top+$z,$w,$h,$start,$end);
$this->get_view($left,$top);
$arh = $this->get_point($left,$top,$w,$h,$start,$end);
for($j=0;$j<count($ar)-2;$j+=2) {
$t= array($ar[$j],$ar[$j+1],$ar[$j+2],$ar[$j+3],$arh[$j+2],$arh[$j+3],$arh[$j],$arh[$j+1]);
if($this->filltype)
imagefilledpolygon($this->im,$t,4,$this->filldarkcolor);
else
imagepolygon($this->im,$t,4,$this->color);
}
if($this->filltype)
imagefilledpolygon($this->im,$ar,count($ar)/2-1,$this->fillcolor);
}
/**
* 弧形
*/
function arc($left,$top,$w,$h,$start,$end,$z=0) {
$ar = $this->get_point($left,$top,$w,$h,$start,$end,$p);
$this->moveto($ar[0],$ar[1]);
for($i=2;$i<count($ar)-2;$i+=2)
$this->lineto($ar[$i],$ar[$i+1]);
}
}

/**
* 重载基类的paint方法
*/
class myGraph extends Graph {
function paint() {
// $this->create(400,300);
$this->create(200,150);
$this->set_ext(400);
$this->set_r(10); // 旋转
$this->filltype = false; //充填
$k = 40; //高
$a =200; //中心x
$b = 150; //中心y
$c = 200; //长轴
$d = 100; //短轴

$this->color(0x000000);
$this->color(0xff0000);
$this->pie($a,$b,$c,$d,0,100,$k);
$this->color(0x00ff00);
$this->pie($a,$b,$c,$d,120,240,$k);
$this->color(0x0000ff);
$this->pie($a+10,$b-10,$c,$d,240,360,$k);
$this->color(0x8080ff);
$this->pie(50,80,40,20,0,360,50);
$this->line($a,0,$a,$b*2);
$this->line(0,$b,$a*2,$b);
}
}

$g = new myGraph;
$g->run();

luojxun 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

JS有现成的插件 做出来的很漂亮。。。用PHP干嘛
[/Quote]
js实现有一个缺点就是不能保存,使用php生成图片就可以保存了。这个需求应该有吧,呵呵。
luojxun 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

好无聊啊,最终是用 js 实现的
[/Quote]
呵呵,我没有源码不知道是不是php实现的,看介绍“The phpChart is a fully featured Ajax PHP control for generating dynamic PHP charts and graphics. ”用js可能性比较高。不过我试了一下使用画矩形,旋转图片,最后贴上去可以,不过会不太精准。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧