2

I've found some similar questions to mine, but none that address my specific situation, so I thought I'd ask.

What I have: A square JPEG, measuring 600px x 600px, that I am getting from an external source.

What I want: To programmatically resize the square to 400x400, and add 75px of white space on each side, making the total final image 550px x 400, with the original square image centered.

I'd be grateful if somebody can point me in the right direction.

4

2 回答 2

0

现在大多数 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 将单独启动一个不计入此限制的单独进程。

于 2021-08-22T23:44:13.087 回答
-2

php.net/manual/en/ref.image.php

这些功能能够完全按照您的意愿行事,而且使用起来也非常简单。

于 2012-12-11T00:29:27.913 回答