PHP之图像处理

澳门新葡亰娱乐官网 8

在调查程序中,我们需要根据统计的数据来
生成各种图表来生动的表示调查的百分比
。在PHP在这方面也是不负众望,它中可以通过加载GD库来实现一开始。饼状图表对于查看一个值占总值的百分比是一个好的方法。现在我们就用PHP来实现一个饼形图表,给大家讲述PHP在这方面的应用。它的设计思想是:首先以用imagecreate来生成一个空白图形,然后在空白图形中用imageare()圆弧函数先画圆弧,再画两条线连接圆心和圆弧端点,再用imagefilltoborder函数来填充扇形。其程序实现如下:

PHP中提供了一些对图像进行编辑处理的函数,其中最为典型的应用为随机图形验证码、图片水印以及数据统计中饼状图和柱状图的生成等

昨天有位客户咨询我一个问题,他在使用然之OA系统时涉及到图片显示时提示下面错误窗口。看到这个错误提示,我们肯定都会想到是不是PHP的gd库未安装,但是这位朋友说他用phpinfo查看了下PHP环境,发现gd扩展已存在,而且问题依旧存在,所以才头疼问题出在哪里。下面是这位朋友给我的截图:

?php/*把角度转换为弧度*/function radians ($degrees){return($degrees * (pi()/180.0));}/*** 取得在圆心为圆上 x,y点的值*/function circle_point($degrees, $diameter){$x = cos(radians($degrees)) * ($diameter/2);$y = sin(radians($degrees)) * ($diameter/2);return (array($x, $y));}// 填充图表的参数$ChartDiameter = 200; //图表直径$ChartFont = 2; //图表字体$ChartFontHeight = imagefontheight($ChartFont);//图表字体的大小$ChartData = array( 75,45);//用于生成图表的数据,可通过数据库来取得来确定//$ChartLabel = array(yes, no); //数据对应的名称//确定图形的大小$ChartWidth = $ChartDiameter + 20;$ChartHeight = $ChartDiameter + 20 +(($ChartFontHeight + 2) * count($ChartData));//确定统计的总数for($index = 0; $index  count($ChartData); $index++){$ChartTotal += $ChartData[$index];}$ChartCenterX = $ChartDiameter/2 + 10;$ChartCenterY = $ChartDiameter/2 + 10;//生成空白图形$image = imagecreate($ChartWidth, $ChartHeight);//分配颜色$colorBody = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);$colorBorder = imagecolorallocate($image, 0x00, 0x00, 0x00);$colorText = imagecolorallocate($image, 0x00, 0x00, 0x00);$colorSlice[] = imagecolorallocate($image, 0xFF, 0x00, 0x00);$colorSlice[] = imagecolorallocate($image, 0x00, 0xFF, 0x00);//填充背境imagefill($image, 0, 0, $colorBody);/*** 画每一个扇形*/$Degrees = 0;for($index = 0; $index  count($ChartData); $index++){$StartDegrees = round($Degrees);$Degrees += (($ChartData[$index]/$ChartTotal)*360);$EndDegrees = round($Degrees);$CurrentColor = $colorSlice[$index%(count($colorSlice))];//画图Fimagearc($image,$ChartCenterX,$ChartCenterY,$ChartDiameter,$ChartDiameter,$StartDegrees,$EndDegrees, $CurrentColor);//画直线list($ArcX, $ArcY) = circle_point($StartDegrees, $ChartDiameter);imageline($image,$ChartCenterX,$ChartCenterY,floor($ChartCenterX + $ArcX),floor($ChartCenterY + $ArcY),$CurrentColor);//画直线list($ArcX, $ArcY) = circle_point($EndDegrees, $ChartDiameter);imageline($image,$ChartCenterX,$ChartCenterY,ceil($ChartCenterX + $ArcX),ceil($ChartCenterY + $ArcY),$CurrentColor);//填充扇形$MidPoint = round((($EndDegrees - $StartDegrees)/2) + $StartDegrees);list($ArcX, $ArcY) = circle_point($MidPoint, $ChartDiameter/2);imagefilltoborder($image,floor($ChartCenterX + $ArcX),floor($ChartCenterY + $ArcY),$CurrentColor,$CurrentColor);}//画边框imagearc($image,$ChartCenterX,$ChartCenterY,$ChartDiameter,$ChartDiameter,0,180,$colorBorder);imagearc($image,$ChartCenterX,$ChartCenterY,$ChartDiameter,$ChartDiameter,180,360,$colorBorder);imagearc($image,$ChartCenterX,$ChartCenterY,$ChartDiameter+7,$ChartDiameter+7,0,180,$colorBorder);imagearc($image,$ChartCenterX,$ChartCenterY,$ChartDiameter+7,$ChartDiameter+7,180,360,$colorBorder);imagefilltoborder($image,floor($ChartCenterX + ($ChartDiameter/2) + 2),$ChartCenterY,$colorBorder,$colorBorder);//画图例for($index = 0; $index  count($ChartData); $index++){$CurrentColor = $colorSlice[$index%(count($colorSlice))];$LineY = $ChartDiameter + 20 + ($index*($ChartFontHeight+2));//draw color boximagerectangle($image,10,$LineY,10 + $ChartFontHeight,$LineY+$ChartFontHeight,$colorBorder);imagefilltoborder($image,12,$LineY + 2,$colorBorder,$CurrentColor);//画标签imagestring($image,$ChartFont,20 + $ChartFontHeight,$LineY,$ChartLabel[$index]: $ChartData[$index],$colorText);}//到此脚本 已经生了一幅图像的,现在需要的是把它发到浏览器上,重要的一点是要将标头发给浏览器,让它知道是一个GIF文件。不然的话你只能看到一堆奇怪的乱码header(Content-type: image/gif);//输出生成的图片imagegif($image);?

 

澳门新葡亰娱乐官网 1

保存为chart.php,运行程序其结果如图1.

PHP中有的图形函数可以直接使用,但多数需要在安装了GD2函数库后才能使用。在Windows平台下安装GD2库很简单,就是PH澳门新葡亰娱乐官网 2澳门新葡亰娱乐官网,P5自带的ext目录中的php_gd2_dll文件。

澳门新葡亰娱乐官网 3

但这是在服务器端生在GIF图片,我们要在HTML文件中应用就需要如下格式来调用它:

如果没有,说明安装PHP时没有安装GD2库,打开php.ini文件,查看php.ini文件(c:winsows),查看文件中是否有一句”;extension
= php_gd2.dll”(Paths and Directories
里),如果有,将其中的“;”去掉,再将文件中扩展目录extension_dir的值设置成PHP的ext目录所在的完整路径,如”extension_dir
= E:php5ext”,保存后重启Apache即可

看到这里,可能一些细心的朋友已经发现问题所在了,很明显,这位用户的gd扩展安装得不完整。这里我先直接给大家展示gd库完整安装后的截图:

?phpecho img src=chart.php  ?

 

澳门新葡亰娱乐官网 4

注:运行环境为apache_1_3_12+php-4.0RC1+win98,windows平台下.
在PHP中图像函数都是在GD库中完成,GD库实际是处理GIF格式的免费软件。要加载GD扩展才能使用php4的GD库可以到下载。解压COPY
php_gd.dll文件到PHP的执行目录,然后编辑php.ini配置文件,找到配置文件中;extension=php_gd.dll这行
去掉;号,如果没有发现则在配置文件的Dynamic Extensions
后增加一行extension=php_gd.dl。最后运行phpinfo()函数,你就可以看到支持信息

绘制一个图形一般包括4个步骤:1)创建一个背景,2)在背景中绘制图形或输入文本,3)输出图形,4)释放所有资源

所以我们在检查PHP环境,要看一下扩展是否安装齐全、完整,针对上面的问题,本文我们将和大家一起分享linux/windows系统中如何完整安装php-gd扩展。

在此之前注意先将php.ini文件里 Language
Options下的output_buffering默认的off改为on,然后重启Apache(Apache
Restart),否则会出现如下的Warning:

linux系统篇

 


Cannot modify header information – headers already sent by…..

1.CentOS系统

例:绘制PNG图形,如绘制一条直线

关于GD扩展

gd扩展是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建图表、图形、缩略图以及其他图像的处理操作。gd扩展支持JPG、PNG、GIF等常见的图片格式,所以在安装php-gd扩展之前,我们需要安装libpng、jpegsrc、freetype这三款软件。下面安装步骤中,具体的路径设置大家根据自己的实际情况进行调整。

澳门新葡亰娱乐官网 5

安装 freetype

wget http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.5.5.tar.gz
tar -xf freetype-2.5.5.tar.gz
cd freetype-2.5.5
./configure --prefix=/usr/local/freetype
make && make install
$image = imagecreate(400,400);//创建一个图像,两个参数表示图像的宽度和高度,单位为像素,并返回此图像的数据流
$background_color = imagecolorallocate($image,255,255,255);//为图像设置了白色的背景流,
$black = imagecolorallocate($image,0,0,0);//为图像设置了黑色的背景流
imageline($image,0,0,100,100,$black);//绘制一条直线,并设置其颜色为黑色
ob_clean();//清除输出,否则图像无法显示
header("Content-type:image/png");//向浏览器发送头信息,输出png图片
imagepng($image);//输出图形
imagedestroy($image);//清除资源

安装jpegsrc

wget http://www.ijg.org/files/jpegsrc.v9.tar.gz
tar zxvf jpegsrc.v9.tar.gz
cd jpeg-9
./configure --prefix=/usr/local/jpeg
make && make install

 

安装libpng

wget http://jaist.dl.sourceforge.net/project/libpng/libpng16/1.6.31/libpng-1.6.31.tar.gz
tar zxvf libpng-1.6.31.tar.gz 
cd libpng-1.6.31
./configure --prefix=/usr/local/libpng
make && make install

图像处理函数可以直接创建一个图像流来绘制图形,还可以将现有的图片作为图像流读入,然后在次基础上对图像进行修饰,如加上水印效果等。这种功能常用来防止图片被盗用

安装GD扩展

不再重新编译php,还是用phpize添加新扩展,注意不要漏掉make
clean这一步。

 cd /data/php-5.6.14/ext/gd/
 make clean
 /usr/local/php/bin/phpize
 ./configure --with-php-config=/usr/local/php/bin/php-config --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/libpng --with-freetype-dir=/usr/local/freetype
 make && make install

澳门新葡亰娱乐官网 6

此时在/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/目录下有出现了gd.so文件。

澳门新葡亰娱乐官网 7

接着修改php.ini文件 添加一行

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/gd.so

最后重启服务,查看php-gd扩展信息即可。

例:在原始图片(jpeg格式)上添加一个水印网址

2.ubuntu系统

sudo apt-get install php5-gd 

注意不是php-gd而是php5-gd。

最后重启服务

澳门新葡亰娱乐官网 8

windows篇


修改PHP配置文件php.ini:

将php.ini文集中的extension=php_gd2.dll  前面的;去掉即可。

最后重启服务。

    ob_clean();
    header("Content-type:image/jpeg");
    $im = imagecreatefromjpeg("dog.jpg");
    $red = imagecolorallocate($im,255,0,0);
    imagestring($im,5,6,10,"http://www.cnblogs.com/520xiuge/",$red);
    imagejpeg($im);
    imagedestroy($im);

小结

本文我们一起分享了如何在linux(centos、ubuntu)/Windows系统中完整安装php-gd扩展,以解决系统应用使用过程中诸如imagecreatefromjpeg()函数无法调用的问题。如果大家在安装过程中有其他问题欢迎和大家一起讨论交流,我们共同学习,共同进步。

更多技术文章,欢迎关注微信公众号

澳门新葡亰娱乐官网 9

澳门新葡亰娱乐官网 10

 

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图