没有图像,互联网会变得很乏味。 但是,为您的网站维护和处理成百上千个图像可能很麻烦。 随着网站设计的更改,您可能需要修改所有图像-例如,您可能需要将所有图像转换为灰度图像或将其调整为原始大小的50%。 您可能还想压缩或裁剪不同的图像。 手动执行此操作非常耗时且容易出错,但是只要具备一点编程知识即可自动进行。
在本教程中,您将学习PHP中的GD(图形绘制)库。 您将看到如何使用该库通过调整大小,裁剪,旋转或过滤图像来处理图像。
什么是GD?
PHP不仅可以为访客提供HTML,还可以做更多的事情。 例如,它具有处理图像的能力。 不仅如此,您还可以从头开始创建自己的图像,然后保存它们或将其提供给用户。
PHP可以使用GD库满足几乎所有基本图像处理需求,这是Graphic Draw的缩写。
建立
如果您使用的是Windows,则可以将php_gd2.dll文件作为扩展名包含在php.ini中 。 如果使用的是XAMPP之类的文件,则可以在目录xampp \ php \ ext中找到php_gd2.dll文件。 您也可以使用phpinfo();
函数检查系统上是否安装了GD phpinfo();
。 如果滚动查看结果输出,将发现与以下内容类似的内容。
![PHP XAMPP GD](https://i-blog.csdnimg.cn/blog_migrate/6f97bdeaf6296d15513fc85647f34b3a.png)
使用PHP GD创建映像
使用PHP操纵图像的第一步是将它们作为图像资源加载到内存中。 这可以通过对不同格式使用不同功能来实现。 所有这些功能的名称都非常相似,因此很容易记住。
创建一个新图像
如果您没有要操纵的原始图像源,那么imagecreatetruecolor()
函数将非常有用。 它接受两个整数参数:width和height。 如果一切按计划进行,它将返回图像资源。 返回的图像资源基本上是具有指定宽度和高度的黑色图像。
加载图像文件
如果您打算处理已经存储在某处的图像,则可以使用诸如imagecreatefromjpeg()
, imagecreatefrompng()
和imagecreatefromgif()
类的函数来受益。 这些将创建一个图像资源,其中包含来自已加载图像文件的所有数据。 这些函数接受一个参数,该参数以URL或文件路径指定要加载的图像的位置。
从字符串创建图像
GD库还允许您使用PHP中的imagecreatefromstring()
函数从字符串创建图像。 请记住,在imagecreatefromstring()
之前,必须在给定的字符串上使用base64_decode()
imagecreatefromstring()
。 该功能可以自动检测图像类型是JPG,PNG,GIF还是其他受支持的格式。
旋转,缩放,裁剪和翻转图像
您可能要对图像资源执行的一些常见操作是旋转,缩放,裁剪和翻转。
回转
您可以使用imagerotate()
函数旋转已在脚本中加载的图像。 它将以图像中心为旋转中心以给定角度旋转图像。 角度作为浮点值提供,PHP认为它是旋转的度值。
有时,旋转后的图像与原始版本相比会具有不同的尺寸。 这意味着旋转后您最终将获得一个未覆盖的区域。 imagerotate()
函数的第三个参数可用于指定旋转后空白区域的背景色。
缩放比例
使用GD库缩放图像非常容易。 您只需要将图像资源以及宽度和高度传递给imagescale()
函数。 如果省略高度,GD将在保持高宽比的同时将图像缩放到指定的宽度。
您还可以指定缩放图像的模式。 可以将其设置为IMG_NEAREST_NEIGHBOUR
, IMG_BILINEAR_FIXED
, IMG_BICUBIC
等。您需要记住的重要一件事是,此函数将返回新的缩放图像源,而不是修改原始图像源。
播种
您可以使用GD中的imagecrop()
函数裁剪任何图像资源。 第一个参数是原始图像资源,第二个参数是具有键x
, y
, width
和height
的关联数组,用于指定裁剪窗口的位置和尺寸。
![使用PHP裁剪和旋转图像](https://i-blog.csdnimg.cn/blog_migrate/77cc347fedaede16618a41c1be95e541.png)
上面的蝴蝶图使用以下代码裁剪:
$im_php = imagecreatefromjpeg('path/to/image');
$size = min(imagesx($im_php), imagesy($im_php));
$im_php = imagecrop($im_php, ['x' => $size*0.4, 'y' => 0, 'width' => $size, 'height' => $size]);
$im_php = imagescale($im_php, 300);
基本上,我们将最小边的长度存储在$size
变量中。 然后,此变量用于定义裁剪矩形的边界。 最后,将图像按比例缩小,使其只有300像素宽和长。 这为我们提供了适当大小的正方形图像。
翻转图像
使用imageflip()
函数可以水平,垂直或双向翻转图像。 它接受要翻转的图像资源作为第一个参数,并接受翻转模式作为第二个参数。 翻转模式可以设置为IMG_FLIP_HORIZONTAL
, IMG_FLIP_VERTICAL
或IMG_FLIP_BOTH
。
![翻转图像的例子](https://i-blog.csdnimg.cn/blog_migrate/8032ad6c977835367f79950c89d659ae.png)
上图中左上方的图像是原始图像。 右上角的图像使用IMG_FLIP_HORIZONTAL
创建,左下角的图像使用IMG_FLIP_VERTICAL
创建,右下角的图像使用IMG_FLIP_BOTH
创建。 ( 乌鸦图片来自Pixabay 。)
将滤镜应用于图像
GD还有一个非常有用的imagefilter()
函数,该函数可以将滤镜应用于使用先前图像的函数加载的不同图像资源上。 此功能可以接受各种参数,具体取决于您要应用的过滤器。
对于初学者,请指定图像资源和要应用的过滤器的名称。 您可以将其设置为docs中提到的12种预定义过滤器类型之一 。
-
IMG_FILTER_NEGATE
:反转图像中的颜色 -
IMG_FILTER_GRAYSCALE
:去除图像的颜色 -
IMG_FILTER_BRIGHTNESS
:使图像更亮或更暗 -
IMG_FILTER_CONTRAST
:增加图像对比度 -
IMG_FILTER_COLORIZE
:将图像着色为选定的颜色 -
IMG_FILTER_EDGEDETECT
:突出显示图像的边缘 -
IMG_FILTER_EMBOSS
:类似于边缘检测,但是使每个边缘都有凸起的外观 -
IMG_FILTER_GAUSSIAN_BLUR
:使用高斯方法模糊图像 -
IMG_FILTER_SELECTIVE_BLUR
:使用选择性方法模糊图像 -
IMG_FILTER_MEAN_REMOVAL
:创建风格化图像的效果 -
IMG_FILTER_SMOOTH
:平滑图像中的锯齿状边缘 -
IMG_FILTER_PIXELATE
:使图像看起来像素化
某些过滤器(例如NEGATE
, GRAYSCALE
, EDGE_DETECT
和EMBOSS
不需要任何其他数据。 其他滤镜(例如BRIGHTNESS
, CONTRAST
和SMOOTH
)可以接受附加参数,该参数指定最终图像的亮度,对比度或平滑度。 PIXELATE
参数允许您指定两个附加参数:块大小以及像素化模式。 最后, COLORIZE
滤镜接受四个参数,这些参数确定红色,绿色和蓝色分量以及alpha通道的值。
![将滤镜应用于图像](https://i-blog.csdnimg.cn/blog_migrate/7eadfae7442ffaa71061d26030d288bb.png)
左上方的图像是原始图像。 使用创建的右上方图像COLORIZE
滤波器,左下,使用所创建的GRAYSCALE
滤波器,并在右下角的图像是使用所创建的BRIGHTNESS
滤波器。 (此蝴蝶图片在Pixabay上找到 。)
其他有用的图像处理功能
您还应该了解不时使用的其他一些通用GD功能。
获取图像尺寸
您可以使用imagesx()
和imagesy()
函数确定图像资源的宽度和高度。
另一个称为getimagesize()
函数也可以用于获取图像的宽度和高度及其类型。 此函数返回一个数组,该数组的元素指定图像的宽度,高度和格式。 数组的前两个元素描述宽度和高度,第三个元素包含一个指定文件格式的常量: IMAGETYPE_PNG
, IMAGETYPE_GIF
等之一。
保存图像
对图像进行所有所需的更改后,您很可能希望将其输出到浏览器或将其保存为文件。 无论哪种情况,都必须使用GD输出函数之一,例如imagejpeg()
, imagepng()
或imagegif()
。 您将图像资源传递给这些输出函数之一,并且,如果要将图像保存到文件中,还需要指定文件名。 您还可以根据图像类型使用第三个可选参数来控制输出图像的质量。
调整目录中所有图像的大小
让我们运用到目前为止所获得的知识来做一些实际的事情。 在本节中,我们将调整特定目录中所有JPEG图像的大小,使其宽度为640像素。 高度将根据原始图像的尺寸自动计算。
我们将调整大小后的图像保存在名为Resized的新文件夹中。 在这种情况下,所有原始图像都具有相同的尺寸,但是该代码将能够正确处理具有不同大小和纵横比的图像。
$directory = 'Nature/';
$images = glob($directory."*.jpg");
foreach($images as $image) {
$im_php = imagecreatefromjpeg($image);
$im_php = imagescale($im_php, 640);
$new_height = imagesy($im_php);
$new_name = str_replace('-1920x1080', '-640x'.$new_height, basename($image));
imagejpeg($im_php, $directory.'Resized/'.$new_name);
}
在上面的代码中,我们首先使用glob()
函数在名为Nature的目录中查找所有带有.jpg扩展名的图像。 图像文件存储在一个数组中,我们一个接一个地循环。
由于我们要调整大小的所有图像都是JPEG,因此我们使用imagecreatefromjpeg()
函数将其加载到脚本中。 然后使用imagescale()
函数将图像调整为特定宽度-在我们的例子中为640像素。 我们没有指定固定高度,因此将自动计算高度。
每个原始图像文件都在文件名后附加了-1920x1080以指示其尺寸。 我们在原始文件名上使用str_replace()
,并将-1920X1080替换为 新图像尺寸。
最后,我们将调整大小后的图像保存在名为Resized的文件夹中,其中包含新文件名。 您还可以将第三个参数传递给imagejpeg()
函数,以设置保存的图像文件的质量。 如果省略第三个参数,则以默认质量75保存图像。
在目录中的每个图像上应用灰度和对比度滤镜
这次,我们将在目录中的每个图像上应用两个不同的过滤器,并将最终结果保存在其他目录中,而无需更改文件名。 让我们深入研究代码,稍后我将解释每个函数的作用。
$directory = 'Nature/';
$images = glob($directory."*.jpg");
foreach($images as $image) {
$im_php = imagecreatefromjpeg($image);
imagefilter($im_php, IMG_FILTER_GRAYSCALE);
imagefilter($im_php, IMG_FILTER_CONTRAST, -25);
$new_name = basename($image);
imagejpeg($im_php, $directory.'Grayscale/'.$new_name);
}
如您所见,我们从自然目录中加载图像的方式与上一个示例完全相同。 但是, imagefilter()
我们将使用imagefilter()
函数在加载的图像资源上应用滤镜。
注意, imagefilter()
会修改原始图像,并根据操作的成功或失败返回TRUE
或FALSE
。 这与上一节中使用的imagescale()
函数不同,后者返回了缩放后的图像资源。
要记住的另一件重要事情是,对比度过滤器接受的值介于-100到100之间。负值表示对比度更高,正值意味着对比度更低。 这与某些人可能期望的相反! 值为0将使图像保持不变。
另一方面,亮度滤镜的最小和最大限制为-255和255。在这种情况下,负值表示最小亮度,而正值表示最大亮度。
我们使用basename()
函数从文件路径中获取文件名,然后使用imagejpeg()
函数保存图像。
最后的想法
本教程的目的是使您熟悉PHP中的GD库,并向您展示如何使用所有这些功能使您的生活更轻松。 您可以将本教程末尾的示例用作编写自己的图像处理脚本的指南。 例如,您可以通过使用imagesx()
函数确定图像的宽度来仅在图像大于给定限制时调整其大小。
所有这些功能为简化图像处理开辟了很多可能性,并最终节省了很多时间。 如果您对本教程有任何疑问,请在评论中让我知道。
翻译自: https://code.tutsplus.com/tutorials/manipulating-images-in-php-using-gd--cms-31701