如果没有图像,互联网会很枯燥。但是,为您的网站维护和操作数百或数千张图像可能会令人头疼。随着您的网站设计发生变化,您可能需要修改所有图像 - 例如,您可能需要将所有图像转换为灰度或将它们调整为原始大小的 50%。您可能还想压缩或裁剪不同的图像。手动执行此操作既耗时又容易出错,但只要具备一点编程知识,就可以实现自动化。
在本教程中,您将了解 PHP 中的 GD(图形绘制)库。您将看到如何使用此库通过调整大小、裁剪、旋转或过滤图像来操作图像。
文章目录:
1、使用 PHP GD 创建图像
创建新图像
加载图像文件
从字符串创建图像
2、旋转、缩放、裁剪和翻转图像
回转
缩放
裁剪
翻转图像
3、对图像应用滤镜
4、其他有用的图像处理功能
获取图像尺寸
保存图像
5、获取和设置特定像素的颜色
6、调整目录中所有图像的大小
7、对目录中的每个图像应用灰度和对比度过滤器
什么是GD?
PHP 可以做的不仅仅是为访问者提供 HTML。例如,它具有操纵图像的能力。不仅如此,您还可以从头开始创建自己的图像,然后将它们保存或提供给用户。
PHP 可以使用GD 库(Graphic Draw的缩写)处理几乎所有基本的图像处理需求。
设置
如果您在 Windows 上工作,您可以将php_gd2.dll文件作为扩展名包含在php.ini中。如果您使用的是 XAMPP 之类的东西,您会在xampp\php\ext目录中找到php_gd2.dll文件。您还可以使用该功能检查您的系统上是否安装了 GD 。如果您滚动浏览结果输出,您会发现类似于以下内容。phpinfo();
您还可以访问要求和安装页面以了解有关安装过程的更多信息。
1、使用 PHP GD 创建图像
使用 PHP 处理图像的第一步是将它们作为图像资源加载到内存中。这可以通过对不同格式使用不同的函数来实现。所有这些函数的名称都非常相似,因此很容易记住。
1-1、创建新图像
imagecreatetruecolor()
如果您没有要操作的原始图像源,该功能将很有帮助。它接受两个整数参数:宽度和高度。如果一切按计划进行,它将返回一个图像资源。返回的图像资源基本上是具有指定宽度和高度的黑色图像。
1-2、加载图像文件
如果您计划处理已存储在某处的图像,您将受益于使用imagecreatefromjpeg()
、imagecreatefrompng()
和imagecreatefromgif()
. 这些将使用加载的图像文件中的所有数据创建一个图像资源。这些函数接受一个参数,该参数以 URL 或文件路径的形式指定您正在加载的图像的位置。
1-3、从字符串创建图像
imagecreatefromstring()
GD 库还允许您使用PHP中的函数从字符串创建图像。请记住,您必须base64_decode()
在给定字符串上使用imagecreatefromstring()
. 该功能可以自动检测图像类型是否为 JPG、PNG、GIF 或其他支持的格式。
2、旋转、缩放、裁剪和翻转图像
您可能希望对图像资源执行的一些常见操作是旋转、缩放、裁剪和翻转。
2-1、回转
imagerotate()
您可以使用该函数旋转已在脚本中加载的图像。它将使用图像的中心作为旋转中心以提供的角度旋转图像。角度以浮点值的形式提供,PHP 将其视为旋转的度数。
有时,旋转后的图像与原始版本相比会有不同的尺寸。这意味着您将在旋转后得到一个未覆盖的区域。函数的第三个参数imagerotate()
可用于指定旋转后空白区域的背景颜色。
2-2、缩放
使用 GD 库缩放图像非常容易。您只需将图像资源以及宽度和高度传递给imagescale()
函数。如果省略高度,GD 会将图像缩放到指定的宽度,同时保留纵横比。
您还可以指定缩放图像的模式。它可以设置为IMG_NEAREST_NEIGHBOUR
、IMG_BILINEAR_FIXED
、IMG_BICUBIC
等。您需要记住的一件重要事情是,此函数返回一个新的缩放图像源,而不是修改原始图像源。
2-3、裁剪
imagecrop()
您可以使用GD中的功能裁剪任何图像资源。第一个参数是原始图像资源,第二个参数是一个关联数组,键x
为 、y
、width
和height
,指定裁剪窗口的位置和尺寸。
上面的蝴蝶图像是使用以下代码裁剪的:
$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 像素宽和长。这给了我们一个适当大小的方形图像。
2-4、翻转图像
imageflip()
使用该功能可以水平、垂直或双向翻转图像。它接受您要翻转的图像资源作为第一个参数,翻转模式作为第二个参数。翻转模式可以设置为IMG_FLIP_HORIZONTAL
、IMG_FLIP_VERTICAL
或IMG_FLIP_BOTH
。
上图中左上图为原图。右上角的图像是使用创建IMG_FLIP_HORIZONTAL
的,左下角的图像是使用创建IMG_FLIP_VERTICAL
的,右下角的图像是使用创建的IMG_FLIP_BOTH
。(乌鸦图片来自Pixabay。)
3、对图像应用滤镜
GD 还有一个非常有用的imagefilter()
功能,它可以在使用以前图像的功能加载的不同图像资源上应用过滤器。此函数可以接受各种参数,具体取决于您应用的过滤器。
对于初学者,请指定要应用的图像资源和过滤器的名称。您可以将其设置为文档中提到的 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 通道的
左上角的图片是原图。右上角的图像是使用COLORIZE
滤镜创建的,左下角的图像是使用滤镜创建的,右下角GRAYSCALE
的图像是使用滤镜创建的BRIGHTNESS
。(这张蝴蝶图片是在Pixabay上找到的。)
4、其他有用的图像处理功能
您还应该了解其他一些不时派上用场的常见 GD 函数。
4-1、获取图像尺寸
imagesx()
您可以使用和imagesy()
函数确定图像资源的宽度和高度。
另一个调用的函数getimagesize()
也可用于获取图像的宽度和高度及其类型。此函数返回一个数组,其中包含指定图像的宽度、高度和格式的元素。数组的前两个元素描述宽度和高度,第三个元素包含一个指定文件格式的常量:IMAGETYPE_PNG
、IMAGETYPE_GIF
等之一。
4-2、保存图像
对图像进行所有所需的更改后,您很可能希望将其输出到浏览器或将其保存为文件。无论哪种情况,您都必须使用 GD 输出函数之一,如imagejpeg()
、imagepng()
或imagegif()
。您将图像资源传递给这些输出函数之一,如果要将图像保存到文件中,您还需要指定文件名。您还可以根据图像类型使用第三个可选参数来控制输出图像的质量。
5、获取和设置特定像素的颜色
PHP 中有多种函数可用于获取或设置图像中特定位置的单个像素的颜色。第一步是创建一个具有诸如imagecreatefrompng()
.
之后,您可以使用该函数imagecolorat($image, $x, $y)
获取给定像素的颜色索引。像素的位置由函数中的第二个和第三个参数决定。如果在真彩色图像上调用此函数,您将获得像素的 RGB 值作为整数。现在,您可以使用位移和遮罩来获得不同的颜色分量,或者使用另一个名为imagecolorsforindex($image, $color)
.
可以使用该imagesetpixel($image, $x, $y, $color)
功能设置任何特定位置的像素颜色。
用PHP替换图像中的颜色
使用我们上面学到的概念,您可以在 PHP 中轻松地将一种颜色替换为另一种颜色。结果的质量会因图像而异。作为一般规则,颜色变化越少意味着更换越好。使用这种方法可以非常有效地替换纯色。让我们编写一些代码来替换下图中的颜色。
<?php $filename = 'fancy_name.png' $im_php = imagecreatefrompng($filename); $origin_color = imagecolorsforindex($im_php, imagecolorat($im_php, 0, 0)); $dark_red = imagecolorallocate($im_php, 100, 0, 30); list($width, $height, $type, $attr) = getimagesize($filename); for($x = 0; $x <= $width - 1; $x++) { for($y = 0; $y <= $height - 1; $y++) { $index_color = imagecolorsforindex($im_php, imagecolorat($im_php, $x, $y)); if($origin_color == $index_color) { imagesetpixel($im_php, $x, $y, $dark_red); } } } imagepng($im_php, 'fancy_name_red.png'); ?>
上面的代码使用上一节中的函数来获取和设置颜色值。你应该注意到我们正在做一个精确的颜色匹配。这可能会导致一些伪影,因为像素在边界周围的颜色可能会略有不同。imagecolorsforindex()
在进行完全匹配时,我们还可以避免对函数的调用。但是,拥有单独的颜色分量可以让您在系统中引入一些容差,并在某些情况下提供更好的结果。这是具有精确颜色比较和替换的最终图像。
6、调整目录中所有图像的大小
让我们应用我们迄今为止获得的知识来做一些实际的事情。在本节中,我们将调整特定目录中所有 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); }
在上面的代码中,我们首先使用该函数在名为Natureglob()
的目录中查找所有扩展名为.jpg的图像。图像文件存储在一个数组中,我们一个一个地循环它们。
由于我们要调整大小的所有图像都是 JPEG,因此我们使用该imagecreatefromjpeg()
函数将它们加载到脚本中。然后使用该imagescale()
函数将图像调整为特定宽度——在我们的例子中为 640 像素。我们没有指定一个固定的高度,所以高度会自动计算。
每个原始图像文件都有-1920x1080附加到文件名以指示其尺寸。我们使用str_replace()
原始文件名并将-1920X1080替换为新的图像大小。
最后,我们使用新文件名将调整大小的图像保存在名为Resized的文件夹中。您还可以将第三个参数传递给imagejpeg()
函数以设置保存的图像文件的质量。如果省略第三个参数,则以默认质量 75 保存图像。
7、对目录中的每个图像应用灰度和对比度过滤器
这一次,我们将对目录中的每个图像应用两个不同的过滤器,并将最终结果保存在不同的目录中,而不对文件名进行任何更改。让我们深入研究代码,稍后我将解释每个函数的作用。
$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); }
如您所见,我们从Nature目录中加载图像,就像我们在前面的示例中所做的那样。但是,我们imagefilter()
这次将使用该函数对加载的图像资源应用过滤器。
请注意,imagefilter()
修改原始图像并返回TRUE
或FALSE
基于操作的成功或失败。这与imagescale()
我们在上一节中使用的函数不同,它返回缩放的图像资源。
要记住的另一件重要的事情是对比度过滤器接受从 -100 到 100 的值。负值意味着更高的对比度,正值意味着更低的对比度。这与某些人的预期相反!值 0 将使图像保持不变。
另一方面,亮度过滤器的最小和最大限制为 -255 和 255。这种情况下的负值表示最小亮度,正值表示最大亮度。
我们使用该函数从文件路径中获取文件名basename()
,然后使用该函数保存图像imagejpeg()
。
最后的想法
本教程的目的是让您熟悉 PHP 中的 GD 库,并向您展示如何使用所有这些函数来让您的生活更轻松。您可以使用本教程末尾的示例作为指南,帮助您编写自己的图像处理脚本。例如,您可以通过使用imagesx()
函数确定其宽度,仅当图像比给定限制更宽时才能调整图像大小。
- 设置
- 1-1、创建新图像
- 1-2、加载图像文件
- 1-3、从字符串创建图像
- 2-1、回转
- 2-2、缩放
- 2-3、裁剪
- 2-4、翻转图像
- 4-1、获取图像尺寸
- 4-2、保存图像
发表评论