分享
 
 
 

说说PHP作图(三)

王朝php·作者佚名  2008-12-18
窄屏简体版  字體: |||超大  

上次说到用GD作各种几何图形,以及填充颜色。其中故意把这样一个较复杂的情况

留到后面,这就是任意多边形和任意多边形的填充颜色。

<?

Header("Content-type: image/png");

$im = ImageCreate (200, 100);

$col_blk = ImageColorAllocate($im, 0,0,0);

$col_grn = ImageColorAllocate($im, 0,255,0);

$parray = array(40,10,60,10,70,20,60,50,40,50,30,20);

// 定义一个数组,12个成员是6个点的横纵坐标。

ImagePolygon($im,$parray,6,$col_grn);

// 这就是绘制任意多边形的函数,$parray是刚才定义的数组,

// 6表示六个点。注意六个点连成的是六边形。

// 不必人为地为了闭合图形而在最后增加一个与第一点相同的点。

ImagePNG($im);

ImageDestroy($im);

?>

你应该已经想到了,任意多边形填充颜色的函数:

<?

Header("Content-type: image/png");

$im = ImageCreate (200, 100);

$col_blk = ImageColorAllocate($im, 0,0,0);

$col_orn = ImageColorAllocate($im, 255,192,0);

$col_yel = ImageColorAllocate($im, 255,255,0);

$col_red = ImageColorAllocate($im, 255,0,0);

$col_grn = ImageColorAllocate($im, 0,255,0);

$col_blu = ImageColorAllocate($im, 0,0,255);

$parray = array(40,10,60,10,70,20,60,50,40,50,30,20);

ImageFilledPolygon($im,$parray,6,$col_grn);

ImagePNG($im);

ImageDestroy($im);

?>

嗯。下面我们可以在图象上写字了。不过,先别高兴,要想写汉字还得费一些麻烦。

这个以后再逐渐解释。先看看怎么简单地写西文字符吧。

<?

Header("Content-type: image/png");

$im = ImageCreate (200, 250);

$col_blk = ImageColorAllocate($im, 0,0,0);

$col_orn = ImageColorAllocate($im, 255,192,0);

$str="This is a test.";

ImageString($im,1,10,10,$str,$col_orn);

ImageString($im,2,10,30,$str,$col_orn);

ImageString($im,3,10,60,$str,$col_orn);

ImageString($im,4,10,100,$str,$col_orn);

ImageString($im,5,10,150,$str,$col_orn);

// 这里连续五次调用ImageString,在不同位置,

// 分别用从小到大的字型输出了字符串 $str。

// ImageString 函数只支持五种字型(1~5)

ImagePNG($im);

ImageDestroy($im);

?>

再看:

<?

//Header("Content-type: image/png");

$im = ImageCreate (200, 250);

$col_blk = ImageColorAllocate($im, 0,0,0);

$col_orn = ImageColorAllocate($im, 255,192,0);

$str="This is a test.";

ImageStringUp($im,1,10,180,$str,$col_orn);

ImageStringUp($im,2,20,180,$str,$col_orn);

ImageStringUp($im,3,40,180,$str,$col_orn);

ImageStringUp($im,4,70,180,$str,$col_orn);

ImageStringUp($im,5,110,180,$str,$col_orn);

// 函数名换成了 ImageStringUp,用法不变。

// 是输出竖排的文字。

ImagePNG($im);

ImageDestroy($im);

?>

在使用输出字符的函数同时,如果能知道不同字型的字在图象里要占用的宽度、高度,

对于安排输出字符的位置将是多么方便的啊!PHP提供给我们了:ImageFontWidth()和

ImageFontHeight(),其参数很简单,只有一个:即字型的编号。例如ImageFontWidth(5)

就是取得5号字每个字符的宽度,ImageFontHeight(3)就是取得3号字每个字符的高度。这么

简单,就不举例了,等一下在后面的代码中还有用到。

跟输出字符串类似,ImageChar和ImageCharUp输出单个字符,用途比较少,甚至可以

不用——无论字符还是字符串,都用ImageString和ImageStringUp就可以了嘛!

下面,我就利用我做过的绘制股票K线分析图的其中一部分代码,把前面讲到的内容系统

地应用一下。因为其中涉及数据库,不能把原始代码拿过来给大家拿回去测试。只能构造一些

数据,模拟从数据库里取得的股市行情。鉴于这里懂股票K线的人可能不多,大家可能不知道K线

图应该怎么画法。然而,我也不能在这里讲K线具体是怎么回事,只是介绍这样一系列方法。等画

好以后,你肯定可以看出,以前确实见过这样的图。

<?php

Header("Content-type: image/png");

$im = ImageCreate(640,260);

$bkground = ImageColorAllocate($im,255,255,255);

$data = ImageColorAllocate($im,0,0,0);

$gird = ImageColorAllocate($im,200,200,160);

$upline = ImageColorAllocate($im,255,0,0);

$dnline = ImageColorAllocate($im,0,175,175);

$d5line = ImageColorAllocate($im,255,127,0);

$d20line = ImageColorAllocate($im,0,0,127);

$d10line = ImageColorAllocate($im,255,0,255);

// 先定义好绘各种对象所用的颜色。

for($i=20;$i<=220;$i+=25)

ImageLine($im, 60, $i, 560, $i, $gird);

for($j=60;$j<=560;$j+=25)

ImageLine($im, $j, 20, $j, 220, $gird);

// 事先计算好位置、格子宽度,用for循环画线,省事多了。

$zzg=10.55;

$zzd=7.63;

$lzg=10350;

// 假设的股市数据,

// $zzg是需要分析的这一段时间的最高价,假设是10.55元。

// $zzd是需要分析的这一段时间的最低价,假设是7.63元。

// $lzg是需要分析的这一段时间的最高成交量,假设是10350手。

// 这是计算坐标网格的“刻度”的重要数据。

$bl=$zzg-$zzd;

// 最高价跟最低价的差额。根据它跟网格总高度之间的比例,

// 就可以得出一个实际的价格在网格里所处的位置。

for($i=1;$i<=7;$i++)

{

$y=$i*25-10;

// 根据网格线的位置计算标注刻度的合适高度(纵坐标)。

$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");

// 计算每根刻度线对应的价格、并格式化该字符串。

$x=55-ImageFontWidth(2)*StrLen($str);

// 根据这个字符串将要占用的宽度,计算出合适的横坐标。

ImageString($im, 2,$x, $y,$str, $data);

// 写出这个字符串。

}

$str=Number_Format($lzg,0,".",",");

ImageString($im,2,564,164,$str,$data);

$str=Number_Format($lzg/2,0,".",",");

ImageString($im,2,564,189,$str,$data);

// 由于写成交量的刻度只有两处,用循环写就不合算了。

// 如果数量比较多,也应该用循环。

// 由于一张K线图要画无数根小K线柱,所以,把画一根小K线柱写成函数

function kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)

// 参数:$img 图象;$kp $zg $zd $sp 是开盘、最高、最低、收盘;

// $cjl 成交量;$ii 计数器,表示K线柱的序号。

{

global $bl,$zzd,$lzg;

// 声明该函数里用到的$bl,$zzd,$lzg三个变量是全局变量。

$h=150; // K线柱区域高度是 150。

$hh=200; // K线柱区域、成交量柱区域总高度是 200。

if($sp<$kp)

$linecolor = ImageColorAllocate($img,0,175,175);

// 如果收盘价低于开盘,是阴线,用青色

else

$linecolor = ImageColorAllocate($img,255,0,0);

// 否则为阳线,用红色。

$x=58+$ii*4;

// 根据K线柱序号计算横坐标。

$y1=20+$h-($kp-$zzd)/$bl*$h;

// 根据开盘价计算对应纵坐标。

$y2=20+$h-($sp-$zzd)/$bl*$h;

// 根据收盘价计算对应纵坐标。

$y3=20+$h-($zg-$zzd)/$bl*$h;

// 根据最高价计算对应纵坐标。

$y4=20+$h-($zd-$zzd)/$bl*$h;

// 根据最低价计算对应纵坐标。

$y5=20+$hh-$cjl/$lzg*($hh-$h);

// 根据成交量计算对应纵坐标。

if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);

else ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);

// 横坐标减1到加1,跨度为3。即绘宽度为3的小填充矩形。

// 高度和纵坐标则是由开盘、收盘价决定的。

// 经测试发现,这个函数必须是左上点坐标写在右下点坐标之前,

// 而非自动判断两点孰为左上,孰为右下。

ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);

// 根据成交量绘成交量柱体。

ImageLine($img,$x,$y3,$x,$y4,$linecolor);

// 根据最高价、最低价绘上下影线。

}

// 试画一根。开盘 8.50 最高 8.88 最低 8.32 收盘 8.80 成交 6578手。

kline($im,8.50,8.88,8.32,8.80,6578,1);

// 再画一根。开盘 8.80 最高 9.50 最低 8.80 收盘 9.50 成交 8070手。

// 光头光脚的大阳线啊!

kline($im,8.80,9.50,8.80,9.50,8070,2);

// 再来一根阴线。开盘 9.80 最高 9.80 最低 8.90 收盘 9.06 成交 10070手。

// 赔了!昨天抛掉多好呀。

kline($im,9.80,9.80,8.90,9.06,10070,3);

// ……

ImagePNG($im);

ImageDestroy($im);

?>

当然,要每一天的数据都这么写,太麻烦了。我做的是从数据库取数据的。

这一次就说到这里。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有