• 日常搜索
  • 端口查询
  • IP查询
  • 在线工具
  • 搜本站

使用GD库在PHP中处理图像

如果没有图像,互联网会很枯燥。但是,为您的网站维护和操作数百或数千张图像可能会令人头疼。随着您的网站设计发生变化,您可能需要修改所有图像 - 例如,您可能需要将所有图像转换为灰度或将它们调整为原始大小的 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();

使用GD库在PHP中处理图像  第1张

您还可以访问要求和安装页面以了解有关安装过程的更多信息。

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_NEIGHBOURIMG_BILINEAR_FIXEDIMG_BICUBIC等。您需要记住的一件重要事情是,此函数返回一个新的缩放图像源,而不是修改原始图像源。

2-3、裁剪

imagecrop()您可以使用GD中的功能裁剪任何图像资源。第一个参数是原始图像资源,第二个参数是一个关联数组,键x为 、ywidthheight,指定裁剪窗口的位置和尺寸。

使用GD库在PHP中处理图像  第2张

上面的蝴蝶图像是使用以下代码裁剪的:

$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_HORIZONTALIMG_FLIP_VERTICALIMG_FLIP_BOTH

使用GD库在PHP中处理图像  第3张

上图中左上图为原图。右上角的图像是使用创建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:使图像看起来像素化

一些过滤器,如NEGATEGRAYSCALEEDGE_DETECT并且EMBOSS不需要任何额外的数据。其他过滤器,如BRIGHTNESSCONTRASTSMOOTH可以接受一个附加参数,该参数指定最终图像的亮度、对比度或平滑度。该PIXELATE参数允许您指定两个附加参数:块大小以及像素化模式。最后,COLORIZE过滤器接受四个参数,这些参数确定红色、绿色和蓝色分量以及 Alpha 通道的

使用GD库在PHP中处理图像  第4张

左上角的图片是原图。右上角的图像是使用COLORIZE滤镜创建的,左下角的图像是使用滤镜创建的,右下角GRAYSCALE的图像是使用滤镜创建的BRIGHTNESS。(这张蝴蝶图片是在Pixabay上找到的。)

4、其他有用的图像处理功能

您还应该了解其他一些不时派上用场的常见 GD 函数。

4-1、获取图像尺寸

imagesx()您可以使用和imagesy()函数确定图像资源的宽度和高度。

另一个调用的函数getimagesize()也可用于获取图像的宽度和高度及其类型。此函数返回一个数组,其中包含指定图像的宽度、高度和格式的元素。数组的前两个元素描述宽度和高度,第三个元素包含一个指定文件格式的常量:IMAGETYPE_PNGIMAGETYPE_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 中轻松地将一种颜色替换为另一种颜色。结果的质量会因图像而异。作为一般规则,颜色变化越少意味着更换越好。使用这种方法可以非常有效地替换纯色。让我们编写一些代码来替换下图中的颜色。

使用GD库在PHP中处理图像  第5张

<?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()在进行完全匹配时,我们还可以避免对函数的调用。但是,拥有单独的颜色分量可以让您在系统中引入一些容差,并在某些情况下提供更好的结果。这是具有精确颜色比较和替换的最终图像。


使用GD库在PHP中处理图像  第6张

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()修改原始图像并返回TRUEFALSE基于操作的成功或失败。这与imagescale()我们在上一节中使用的函数不同,它返回缩放的图像资源。

要记住的另一件重要的事情是对比度过滤器接受从 -100 到 100 的值。负值意味着更高的对比度,正值意味着更低的对比度。这与某些人的预期相反!值 0 将使图像保持不变。

另一方面,亮度过滤器的最小和最大限制为 -255 和 255。这种情况下的负值表示最小亮度,正值表示最大亮度。

我们使用该函数从文件路径中获取文件名basename(),然后使用该函数保存图像imagejpeg()

最后的想法

本教程的目的是让您熟悉 PHP 中的 GD 库,并向您展示如何使用所有这些函数来让您的生活更轻松。您可以使用本教程末尾的示例作为指南,帮助您编写自己的图像处理脚本。例如,您可以通过使用imagesx()函数确定其宽度,仅当图像比给定限制更宽时才能调整图像大小。




文章目录
  • 文章目录:
  • 什么是GD?
    • 设置
  • 1、使用 PHP GD 创建图像
    • 1-1、创建新图像
    • 1-2、加载图像文件
    • 1-3、从字符串创建图像
  • 2、旋转、缩放、裁剪和翻转图像
    • 2-1、回转
    • 2-2、缩放
    • 2-3、裁剪
    • 2-4、翻转图像
  • 3、对图像应用滤镜
  • 4、其他有用的图像处理功能
    • 4-1、获取图像尺寸
    • 4-2、保存图像
  • 5、获取和设置特定像素的颜色
  • 6、调整目录中所有图像的大小
  • 7、对目录中的每个图像应用灰度和对比度过滤器
  • 最后的想法
  • 发表评论