仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1075|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:说说PHP作图(三)

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:17:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我想在讲述自己的学习方式前,对那些期望能从我的文章中获得有用信息的人说一句心里话:       前次说到用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);
?>


    固然,要每天的数据都这么写,太费事了。我做的是从数据库取数据的。


    这一次就说到这里。  学习如何将PHP与HTML结合起来完成简单动态页面
莫相离 该用户已被删除
20#
发表于 2015-6-27 21:28:50 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
活着的死人 该用户已被删除
19#
发表于 2015-6-18 03:35:13 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
只想知道 该用户已被删除
18#
发表于 2015-6-17 21:14:27 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
飘飘悠悠 该用户已被删除
17#
发表于 2015-5-6 18:12:09 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
愤怒的大鸟 该用户已被删除
16#
发表于 2015-5-5 14:21:45 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
深爱那片海 该用户已被删除
15#
发表于 2015-4-26 01:44:11 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
金色的骷髅 该用户已被删除
14#
发表于 2015-4-14 18:50:37 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
简单生活 该用户已被删除
13#
发表于 2015-4-12 06:54:42 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
飘灵儿 该用户已被删除
12#
发表于 2015-3-31 11:54:55 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
11#
发表于 2015-3-26 07:25:55 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
海妖 该用户已被删除
10#
发表于 2015-3-22 23:25:11 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-16 17:21:52 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
因胸联盟 该用户已被删除
8#
发表于 2015-3-8 23:06:27 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
爱飞 该用户已被删除
7#
 楼主| 发表于 2015-3-7 02:16:33 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
再现理想 该用户已被删除
6#
发表于 2015-3-6 19:14:15 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
兰色精灵 该用户已被删除
5#
发表于 2015-3-6 10:43:55 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-27 07:42:18 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
蒙在股里 该用户已被删除
板凳
发表于 2015-2-9 14:44:30 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 15:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表