处理 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 。结果如下:

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

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
实用程序一起使用:
老的编译标志 | 新的编译标志 |
---|---|
--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-*
选项。此外,现在还自动支持 PNG 和 ZLIB;不过,操作系统上必须安装 libpng
和 zlib
。
现在我们来看看 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
扩展中的更改。