跳转到内容

PHP 编程/图像

来自维基教科书,开放的书籍,开放的世界

PHP 可以使用 GD 图形库(默认情况下从 PHP 3.0 开始包含)动态地创建和修改图像。

创建新图像需要几个步骤:

  1. 加载新图像或现有图像到内存。
  2. 可选加载要添加的颜色。
  3. 可选修改组件(创建线条、点、填充、添加文本等)。
  4. 通过在标头中发布图像类型来恢复图像。
  5. 释放内存。

创建新图像

[编辑 | 编辑源代码]

要从无到有创建图像,请使用以下函数:

imagecreatetruecolor($height, $width)

该函数在内存中创建一个新图像,其高度和宽度以像素定义,并返回对新图像的引用。

还有一个用于此目的的函数,但它不推荐,因为其颜色幅度较差[1]

imagecreate($height, $width)

要将磁盘上保存的图像加载到内存中,请使用以下函数:

imagecreatefrom<type>($path)

示例

$img = imagecreatefrompng('image.png');

其他函数

imagecreatefromstring($text)

该函数根据参数中指定的文本格式创建图像。

如果发生错误,这些函数将返回 false

使用颜色

[编辑 | 编辑源代码]

要分配颜色,必须定义 RGB 参数。

$color = imagecolorallocate($image,$r,$g,$b)

要在 PNG 中定义透明度,请使用以下函数:

imagecolortransparent($image,$color)

其中 $colorimagecolorallocate 的结果。

还可以使用以下函数确定透明度,范围为 0 到 127(表示完全透明):

imagecolorallocatealpha($image,$r,$g,$b,$transparency)

注意:第一个分配的颜色定义了整个图像的背景。

创建和着色图像后,就可以对其应用以下操作:

  • 绘制一些像素(例如:创建线条)。
  • 通过指定区域来修改现有像素。

绘制形状

[编辑 | 编辑源代码]

要绘制像素,我们使用其坐标(以下为 x, y)

imagesetpixel(image, x, y, color)

要在两点之间绘制一条线,请使用以下函数:

imageline(image, x1, y1, x2, y2, color)

要从对角线创建矩形,请使用以下函数:

imagerectangle(image, x1, y1, x2, y2, color)

要从中心、高度和宽度表示椭圆,请使用以下函数:

imageellipse(image, x, y, h, l, color)

或者通过在梯度(按顺时针编号)中指定其弧度来表示:

imagearc(image, x, y, h, l, angle1, angle2, color)

修改现有像素

[编辑 | 编辑源代码]

用于修改图像(如照片)的最常用的函数无疑是 imagecopyresized,它允许复制矩形区域并将其粘贴到另一个图像中[2]。示例

imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h);

其中:

  • src_image 是源图像;
  • dst_image 是目标图像;
  • dst_x, dst_ydst_image 的坐标;
  • src_x, src_ysrc_image 的坐标,从左上角开始;
  • dst_w, dst_h, src_w, src_h 是源和目标矩形的宽度和高度。

因此,如果 dst_w 等于 src_w,并且 dst_h 等于 src_h,则图像矩形部分将保持相同大小。相反,我们将拉伸或放大图像。

imagecopyresampled 函数接收与 imagecopyresized 相同的参数,但在调整大小的情况下,质量得到提升。

此外,还存在 imagefilter 函数,它允许实现多种效果,例如灰度、浮雕或重新着色[3]

[编辑 | 编辑源代码]

可以通过名为 header 的函数使用 content-type(默认情况下为 text/html)来指定获得的图像格式(“png”、“jpeg”或“gif”)。

header("Content-type: image/<type>");

要之后可视化图像,请根据其类型将其作为参数放在函数中:imagepngimagejpegimagegif

然后,使用 imagedestroy($image) 释放内存。此步骤是可选的,但强烈建议在处理大型图像时执行。

以下代码在浏览器中显示一个 100 像素黑色正方形内的 50 像素红色正方形。

$image = imagecreatetruecolor(100, 100);
$color = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image,0,0,50,50,$color);
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);

参考资料

[编辑 | 编辑源代码]


华夏公益教科书