PHP 编程/图像
PHP 可以使用 GD 图形库(默认情况下从 PHP 3.0 开始包含)动态地创建和修改图像。
创建新图像需要几个步骤:
- 加载新图像或现有图像到内存。
- 可选加载要添加的颜色。
- 可选修改组件(创建线条、点、填充、添加文本等)。
- 通过在标头中发布图像类型来恢复图像。
- 释放内存。
要从无到有创建图像,请使用以下函数:
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)
其中 $color
是 imagecolorallocate
的结果。
还可以使用以下函数确定透明度,范围为 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_y
是dst_image
的坐标;src_x, src_y
是src_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>");
要之后可视化图像,请根据其类型将其作为参数放在函数中:imagepng
、imagejpeg
或 imagegif
。
然后,使用 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);