• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用GD在PHP中处理图像

如果没有图像,互联网会很枯燥。但是,为您的网站维护和操作数百或数千张图像可能会令人头疼。随着您的网站设计发生变化,您可能需要修改所有图像 - 例如,您可能需要将所有图像转换为灰度或将它们调整为原始大小的 50%。您可能还想压缩或裁剪不同的图像。手动执行此操作既耗时又容易出错,但只要具备一点编程知识,就可以实现自动化。

在本教程中,您将了解 php 中的 GD(图形绘制)库。您将看到如何使用此库通过调整大小、裁剪、旋转或过滤来操作图像。

什么是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张您还可以访问要求和安装页面以了解有关安装过程的更多信息。

使用 PHP GD 创建图像

使用 PHP 处理图像的第一步是将它们作为图像资源加载到内存中。这可以通过对不同格式使用不同的函数来实现。所有这些函数的名称都非常相似,因此很容易记住。

创建新图像

imagecreatetruecolor() 如果您没有要操作的原始图像源,该功能将很有帮助。它接受两个整数参数:宽度和高度。如果一切按计划进行,它将返回一个图像资源。返回的图像资源基本上是具有指定宽度和高度的黑色图像。

加载图像文件

如果您计划处理已存储在某处的图像,您将受益于使用imagecreatefromjpeg()、imagecreatefrompng()和imagecreatefromgif(). 这些将使用加载的图像文件中的所有数据创建一个图像资源。这些函数接受一个参数,该参数以 URL 或文件路径的形式指定您正在加载的图像的位置。

从字符串创建图像

imagecreatefromstring()GD 库还允许您使用PHP中的函数从字符串创建图像。请记住,您必须base64_decode()在给定字符串上使用imagecreatefromstring(). 该功能可以自动检测图像类型是否为 JPG、PNG、GIF 或其他支持的格式。

旋转、缩放、裁剪和翻转图像

您可能希望对图像资源执行的一些常见操作是旋转、缩放、裁剪和翻转。

回转

imagerotate()您可以使用该函数旋转已在脚本中加载的图像。它将使用图像的中心作为旋转中心以提供的角度旋转图像。角度以浮点值的形式提供,PHP 将其视为旋转的度数。 

有时,旋转后的图像与原始版本相比会有不同的尺寸。这意味着您将在旋转后得到一个未覆盖的区域。函数的第三个参数imagerotate()可用于指定旋转后空白区域的背景颜色。

缩放

使用 GD 库缩放图像非常容易。您只需将图像资源以及宽度和高度传递给imagescale()函数。如果省略高度,GD 会将图像缩放到指定的宽度,同时保留纵横比。 

您还可以指定缩放图像的模式。它可以设置为、、等。您需要记住的一件重要事情是,此函数返回一个新的缩放图像源,而不是修改原始图像源。IMG_NEArest_NEIGHBOURIMG_BILINEAR_FIXEDIMG_BICUBIC

裁剪

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

使用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 像素宽和长。这给了我们一个适当大小的方形图像。

翻转图像

imageflip()使用该功能可以水平、垂直或双向翻转图像。它接受您要翻转的图像资源作为第一个参数,翻转模式作为第二个参数。翻转模式可以设置为IMG_FLIP_HORIZONTAL、IMG_FLIP_VERTICAL或IMG_FLIP_BOTH。

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

上图中左上图为原图。右上角的图像是使用创建IMG_FLIP_HORIZONTAL的,左下角的图像是使用创建IMG_FLIP_VERTICAL的,右下角的图像是使用创建的IMG_FLIP_BOTH。( 乌鸦图片来自Pixabay。)

对图像应用滤镜

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 通道的值。

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

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

其他有用的图像处理功能

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

获取图像尺寸

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

另一个调用的函数getimagesize()也可用于获取图像的宽度和高度及其类型。此函数返回一个数组,其中包含指定图像的宽度、高度和格式的元素。数组的前两个元素描述宽度和高度,第三个元素包含一个指定文件格式的常量IMAGETYPE_PNG: 、IMAGETYPE_GIF等之一。

保存图像

对图像进行所有所需的更改后,您很可能希望将其输出到浏览器或将其保存为文件。无论哪种情况,您都必须使用 GD 输出函数之一,如imagejpeg()、imagepng()或 imagegif()。您将图像资源传递给这些输出函数之一,如果要将图像保存到文件中,您还需要指定文件名。您还可以根据图像类型使用第三个可选参数来控制输出图像的质量。

调整目录中所有图像的大小

让我们应用我们迄今为止获得的知识来做一些实际的事情。在本节中,我们将调整特定目录中所有 JPEG 图像的大小,使其宽度为 640 像素。高度将根据原始图像的尺寸自动计算。

我们将调整大小的图像保存在一个名为Resized的新文件夹中。在这种情况下,所有原始图像都具有相同的尺寸,但代码将适用于具有不同尺寸和纵横比ios的图像。

$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 保存图像。

对目录中的每个图像应用灰度和对比度过滤器

这一次,我们将对目录中的每个图像应用两个不同的过滤器,并将最终结果保存在不同的目录中,而不对文件名进行任何更改。让我们深入研究代码,稍后我将解释每个函数的作用。

$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()函数确定其宽度,仅当图像比给定限制更宽时才能调整图像大小。



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