现在大多数 PHP 安装都安装了 GD 图像库。但是,GD 缺少一种功能,可以轻松一步完成您想要的操作。
如果您有权访问 ImageMagick,则可以从命令行或其 PHP API Imagick 使用它。命令行参数:
convert /path/to/old/image --resize 400x400 --bordercolor white -border 75x0 /path/to/new/image
可能会做你想要的,如果它不是你想要的,你可以使用 ImageMagick 文档和实验来调整它。在 PHP 中,这可以通过调用 来执行exec()
,只是要注意不要在调用中使用任何用户提供的输入,因为这可能会带来严重的安全风险。或者,您可以使用需要单独安装的 Imagick PHP 扩展,但允许您使用实际的 PHP 函数而不是单独的命令行调用。
使用 GD,你需要做更多的工作:
// Load image from file
$image=imagecreatefromjpeg('/path/to/image.jpg');
// Resize to 400x400
$image=imagescale($image,400,400);
// Create new blank image (defaults to black background)
$new_image=imagecreatetruecolor(550,400);
// Initialize a new color
$white=imagecolorallocate($new_image,255,255,255);
// Fill the newly-created image with white
imagefilledrectangle($new_image,0,0,550,400,$white);
// Embed old image into new image
imagecopy($new_image,$image,75,0,0,0,400,400);
// Write finished image to disk, use quality setting of 85:
imagejpeg($new_image,'/path/to/new/image.jpg',85);
我已经用 PHP 7.4 测试了这段代码,但我不知道与其他版本有任何明显的差异。
使用该函数有一种更简洁的方法(将两个步骤压缩为一个),imagecopyresized
但我不喜欢这样做,因为它并没有真正提高性能,并且生成的代码可读性较差,因为该函数有多达 10 个参数,总是调试的噩梦。
如您所见,ImageMagick 使这变得更简单。但是,并不是每个人都可以访问它,而且由于它是一个更大、更复杂的软件包,它可能会带来更大的安全风险,因此即使您在服务器上有 root 访问权限,您也可能不希望安装它。根据您正在做的事情,GD 在某些情况下也可以稍微更快和更轻量级。
另一个警告:使用 GD 将导致脚本将图像作为 PHP 进程的一部分加载到内存中,并且此内存使用量(可能非常高,因为图像处理是内存密集型的)将计入 PHP 的内存限制,而调用ImageMagick 将单独启动一个不计入此限制的单独进程。