处理 GD 扩展的更改

GD 扩展是一种利用 GD 库的图像处理扩展。GD 最初代表 GIF Draw。奇怪的是,在 Unisys 取消了生成 GIF 时使用的压缩技术的开源许可后,GD 库不得不撤销对图形交换格式(GIF)的支持。不过,2004 年后,Unisys 对该技术的专利到期,GIF 支持得以恢复。目前,PHP GD 扩展支持联合图像专家组(JPEG 或 JPG)、便携式网络图像(PNG)、GIF、X BitMap(XBM)、X PixMap(XPM)、无线位图(WBMP)、WebP 和位图(BMP)格式。

有关 GD 库的更多信息,请参见 https://libgd.github.io/

现在让我们来看看资源到对象的迁移对 GD 扩展的影响。

GD 扩展资源到对象迁移

与以前使用资源的其他 PHP 扩展一样,GD 扩展也主要从资源迁移到了对象。如 PHP 8 扩展资源到对象的迁移部分所述,所有 imagecreate*() 函数现在都生成 GdImage 对象而不是资源。

有关 PHP 8 移植后代码中断的示例,请在两个不同的浏览器标签页中(在本地计算机上)运行这些示例并比较其差异。首先,我们使用以下 URL 运行 PHP 7 示例: http://172.16.0.77/ch07/php7_gd_is_resource.php 。结果如下:

image 2023 11 22 17 07 58 454
Figure 1. Figure 7.2 – PHP 7 GD image resource

从前面的输出中可以看到,资源扩展名已被识别,但没有描述性信息。现在,让我们使用以下 URL 运行 PHP 8 示例: http://172.16.0.88/ch07/php8_gd_is_resource.php 。结果如下:

image 2023 11 22 17 09 00 007
Figure 2. Figure 7.3 – PHP 8 GD image object instance

PHP 8 的输出不仅能将返回类型识别为 GdImage 实例,还能在图像下方显示描述性信息。

现在我们来看看 GD 扩展的其他变化。

GD 扩展编译标志更改

GD 扩展不仅利用了 GD 库,还利用了许多辅助库。需要这些库来提供对各种图形格式的支持。以前,从源代码编译自定义版本的 PHP 时,需要指定 JPEG、PNG、XPM 和 VPX 格式库的位置。此外,由于压缩是减小最终文件大小的一个重要方面,因此还需要指定 ZLIB 的位置。

在从源代码编译 PHP 8 时,有许多重要的配置标志变化,这些变化最早出现在 PHP 7.4 中,后来被带到了 PHP 8 中。最主要的变化是不再需要指定库所在的目录。PHP 8 现在使用与操作系统相当的 pkg-config 来定位库。

下表概述了编译标志的更改。这些标志在实际编译过程之前与 configure 实用程序一起使用:

Table 1. Table 7.3 – GD compile option changes
老的编译标志 新的编译标志

--with-gd

--enable-gd

--with-jpeg-dir=DIR

--with-jpeg

--with-xpm-dir=DIR

--with-xpm

--with-vpx-dir=DIR

--with-webp

--with-png-dir=DIR

removed:libpng is required

--with-zlib-dir

removed:zlib is required

从表中可以看出,大部分 --with-*-dir 选项都被替换为 --with-* 选项。此外,现在还自动支持 PNGZLIB;不过,操作系统上必须安装 libpngzlib

现在我们来看看 GD 扩展的其他小改动。

其他 GD 扩展更改

除了上一节描述的主要改动外,还有一些其他的小改动,包括函数签名的改动和一个新函数。让我们从 imagecropauto() 函数开始讨论。

下面是 imagecropauto() 的旧函数签名:

imagecropauto(resource $image , int $mode = -1,
        float $threshold = .5 , int $color = -1 )

在 PHP 8 中,$image 参数现在是 GdImage 类型。$mode 参数现在默认为 IMG_CROP_DEFAULT 预定义常量。

另一项更改会影响 imagepolygon()imageopenpolygon()imagefilledpolygon() 函数。以下是 imagepolygon() 的旧函数签名:

imagepolygon(resource $image, array $points,
    int $num_points, int $color)

在 PHP 8 中,$num_points 参数现在是可选参数。如果省略,点数的计算方法如下:count($points)/2。不过,这意味着 $points 数组中的元素数必须是偶数!

最后一个重大变化是添加了新函数 imagegetinterpolation()。 这是它的函数签名:

imagegetinterpolation(GdImage $image) : int

返回值是一个整数,本身并没有什么用处。不过,如果查看一下 imagesetinterpolation() 函数的文档 ( https://www.php.net/manual/en/function.imagesetinterpolation.php ),就会看到插值方法代码列表和解释。

现在,您已经知道 GD 扩展中引入了哪些更改。接下来,我们将检查 Reflection 扩展中的更改。