PHP 创建和绘制图像
本文最后更新于:2024年3月18日 凌晨
PHP 创建和绘制图像
- 现在,我们从最简单的GD例子来时学习,示例9-1的PHP脚本可以生成一个黑色正方体,这段代码可以在支持PNG图像格式的任何GD版本下运行。
示例9-1:白色背景上的一个黑色正方形。
1 2 3 4 5 6 7 8
| <?php $im = ImageCreate(200,200); $white = ImageColorAllocate($im,0xFF,0xFF,0xFF); $black = ImageColorAllocate($im,0x00,0x00,0x00); ImageFilledRectangle($im,50,50,150,150,$black); header('Content-Type: image/png'); ImagePNG($im); ?>
|
- 示例9-1演示了创建任何图像的基本步骤演示了创建图像的基本步骤:创建图像,分配颜色,绘图既保存或发送图像。
- 要查看结果,只需用浏览器访问black.php即可,如果要将该图像嵌入WEB页面,可以使用:
图像程序的结构
- 大多数动态图像创建程序都遵循示例9-1所采用的基本步骤。
- 你可以用
ImageCreate()
函数创建一个256色的图像,该函数返回一个图像句柄:
1
| $imgae = ImageCreate(width,height);
|
- 所有在图像中使用的颜色都要用
ImagrColorAllocate()
来分配,第一个分配的值会被用作背景色(只有当图像包含调色板时才能实现,使用ImageCreateTrueColor()
函数创建的真彩色图像不遵循这个原则)
1
| $color = ImageColorAllocate(image,red,green,blue);
|
ImageColorAllocate()
函数的参数分别是组成一种颜色的RGB分值,在示例9-1,我们使用了16进制来表示颜色值,为的是使函数调用时传送的参数与HTML颜色表示相似(“#FFFFFF”和”#000000”)
- GD中有很多绘图元件(drawing,primitive,如矩形,线段,多边形等),示例9-1使用了
ImageFillRectangle()
函数来制定你要填充的区域,参数中含有矩形左上角和右下角的坐标,它们用于控制图像的大小和位置。
1
| ImageFillRectangle(image,tlx,tly,brx,bry,color);
|
- 下一步是将一个Content-Type头部发送到浏览器,该头部信息包含所创建的图像的类型信息,然后我们就可以调用合适的输出函数,如
ImageJPEG()
,ImagePNG()
和ImageWBMP()
函数来创建相应的JPEG,PNG和WBMP图像文件:
1 2 3
| ImageJPEG(image [, filename [,quality]]); ImagePNG(iamge [, filename]); ImageWBMP(image [, filename]);
|
- 如果没有指定图像文件名,则图像将发送到浏览器,quality参数可用来指定JPEG图像的质量(0最差,10最好),质量越小,JPEG文件就越小,它的默认值为7.5
- 示例9-1中,我们在调用输出函数
ImagePNG()
之后马上就设置了一个HTTP头,如果你在程序一开始就设置Content-Type,则程序所产生的任何错误都会被当成图像数据来处理,浏览器就会显示一个图像损坏的图标,下表中列出了图像格式和它们相应的Content-Type值:
格式 |
Content-Type |
GIF |
image/gif |
JPEG |
image/jpeg |
PNG |
Image//png |
WBMP |
Image/vnd.wap.wbmp |
改变输出的图像格式
- 就像你所得到的结论,只要在程序中改动两处就能改变图像输出的格式:发送一个不同的Content-Type并使用一个不同的图像生成函数,示例9-2将示例9-1生成的图像的格式由PNG改为JPEG
示例9-2:黑色正方形的JPEG版本。
1 2 3 4 5 6 7 8
| <?php $im = ImageCreate(200,200); $white = ImageColorAllocate($im,0xFF,0xFF,0xFF); $black = ImageColorAllocate($im,0x00,0x00,0x00); ImageFilledRectangle($im,50,50,150,150,$black); header('Content-Type: image/jpeg'); ImageJPEG($im); ?>
|
测试支持的图像格式
- 如果你的代码需要在支持不同图像格式的系统间移植,请使用
ImageTypes()
函数来检测被支持的图像类型,该函数返回一个位字段(bitfield):你可以使用位与操作符(&)来检验某个位是否被设置,常量IMG_GIF,IMG_JPG,IMG_PNG和IMG----WBMP与相应的图像格式位相对应。
- 示例9-3中,如果支持PNG格式,则生成PNG图像,如果不支持PNG,则生成JPEG图像,如果两个都不支持,则生成GIF图像。
示例9-3:检查被支持的图像格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php $im = ImageCreate(500, 500); $white = ImageColorAllocate($im, 0xFF, 0xFF, 0xFF); $black = ImageColorAllocate($im, 0x00, 0x00, 0x00); ImageFilledRectangle($im, 50, 50, 150, 150, $black); if (ImageTypes() & IMG_PNG) { header('Content-Type: image/png'); ImagePNG($im); } else if (ImageTypes() & IMG_JPG) { header('Content-Type: image/jpeg'); ImageJPEG($im); } else if (ImageTypes() & IMG_GIF) { header('Content-Type: image/gif'); ImageGIF($im); } ?>
|
读一个已存在的文件
- 如果你想读取一个已经存在的图像文件并修改它,可以使用
ImageCreateFromJPEG()
或ImageCreateFromPNG()
函数:
1 2
| $image = ImageCreateFromJPEG(filename); $image = ImageCreateFromPNG(filename);
|
基本绘图函数
- GD有一些函数用于绘制点,线,弧,矩形和多边形,本节将介绍GD2.x所支持的基本绘图函数。
- 最常用的函数是
ImageSetPixel()
,用于设定特定像素的颜色:
1
| ImageSetPixel(image,x,y,color);
|
- 有两个绘制线条的函数----
ImageLine()
和ImageDashedLine()
1 2
| ImageLine(image,start_x,start_y,end_x,end_y,color); ImageDashedLine(image,start_x,start_y,end_x,end_y,color);
|
- 有两个绘制矩形的函数,一个只是绘制轮廓,另一个则用指定颜色填充矩形。
1 2
| ImageRectangle(image,tlx,tly,brx,bry,color); ImageFillRectangle(image,tlx,tly,brx,bry,color);
|
- 可通过指定左上角和右下角坐标来指定矩形的位置和大小。
- 你可以用
ImagePolygon()
和ImageFilledPolygon()
函数来绘制任意的多边形。
1 2
| ImagePolygon(image, points,number,color); ImageFilledPolygon(image, points,number,color)
|
- 这两个函数都有一个points参数,它是一个数组,该数组描述了多边形的顶点(每个顶点都有两个整数坐标x和y),number参数指定了顶点的个数(典型值是
count($points)/2
)
ImageArc()
函数用于绘制弧线(即椭圆的一部分)
1
| ImageArc(image,center_X,center_y,width,height,start,end,color);
|
- 一个椭圆是由它的中心,宽和高定义的(对于圆来说,宽和高是一样的),弧线起始角度(参数start)和结束角度(参数end)是从时钟3点的位置顺时针开始计数的,如果要画一个完整的椭圆,start和end的值应分别为0和360
- 填充一个已经画好的形状有两种方法,
ImageFill()
函数将改变指定位置的像素周围的像素的颜色,并向外扩充,像素颜色的变化标识着填充的边界,ImageFillToBorder()
函数允许指定填充区域边界的颜色值。
1 2
| ImageFill(image,x,y,color); ImageFillToBorder(image,x,y,border_color,color);
|
- 还有一个功能可能是你需要的----旋转图像,这个功能可能会很有用,
Imagerotate()
函数的用法如下:
1
| Imagerotate(image,angle,background,color);
|
- 示例9-4演示了我们之前见过的黑色正方形图形旋转455度后的结果,background color参数指定了图像旋转后未覆盖的区域的颜色,该参数值为1则显示黑白颜色的对比,在你把图像旋转功能加入到正式产品中之前,请一定要多测试这个函数的执行结果。
示例9-4:图像旋转示例。
1 2 3 4 5 6 7 8 9
| <?php $im = ImageCreate(200, 200); $white = ImageColorAllocate($im, 0xFF, 0xFF, 0xFF); $black = ImageColorAllocate($im, 0x00, 0x00, 0x00); ImageFilledRectangle($im, 50, 50, 150, 150, $black); header('Content-Type: image/jpeg'); $im_rotated = imagerotate($im,45,1); ImageJPEG($im_rotated); ?>
|