如果我正确理解了您想要的内容,那么您已经完成了一部分。现在,如果您尝试使用透明的 PNG(源和目标)而不是 jpeg,它将使图像变平并使背景变为纯白色,您不希望这样吗?
您需要做的是确定图像是否具有或可能具有透明度,然后将背景颜色设置为无。 -extent 使图像变平,因此在这些情况下,为了保持透明度,背景需要为 None。 (而且,如上所述,您当然需要使用 png 或 gif 输出而不是 jpg,因为 jpeg 无法处理透明度。)通常我会进行简单的扩展检查,因为它在大多数情况下已经足够好了,but there are more detailed checks.
$background = preg_match('/\.gif$|\.png$/', $thumbnailFilename) == 1 ? 'None' : 'white';
$edge = shell_exec("convert $imgFile -resize 1024x724 -background $background -gravity center -extent 1024x724 -quality 90 $thumbnailFilename");
我在这里检查输出缩略图,因为如果您要输出到 jpeg,无论来源如何,它都会被剥夺透明度。有了这个,如果你提供 $imgFile 作为 test-transparent1.png 和 $thumbnailFilename 作为 test-transparent1.sized.png,test-transparent1.sized.png 的大小应该适合 1024x724 并用透明像素填充,所以原始图像居中。
==为 ImageMagick PHP 类编辑:==
首先,为了进行比例缩放,您需要将 scaleImage 的最佳拟合参数设置为 true。此外,当您使用 API 时,extentImage 似乎根本不使用重力选项,因此我们必须使用负 X 或 Y 偏移来将图像正确居中在新画布上。这是我的测试脚本运行后的样子:
<?php
$targetFile = 'mizu.png';
$targetThumb = 'mizu.thumb.png';
$background = preg_match('/\.gif$|\.png$/', $targetThumb) == 1 ? 'None' : 'white';
$img = new Imagick($targetFile);
$img->scaleImage(150,150,true);
$img->setImageBackgroundColor($background);
$w = $img->getImageWidth();
$h = $img->getImageHeight();
$img->extentImage(150,150,($w-150)/2,($h-150)/2);
$img->writeImage($targetThumb);
== 每个 cmets 更新:==
对于那些在6.5.7-8之后使用imagemagick的人,需要调整这个答案,使extentImage的x和y值为负。您可以在 php.net/manual/en/imagick.extentimage.php 看到警告说明 - 由 Jeff Richards 提供