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页面,可以使用:
1
<img src="black.php">

图像程序的结构

  • 大多数动态图像创建程序都遵循示例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);
?>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!