如果我正确地理解了您想要什么,那么您已经在那儿了。现在,如果您尝试使用透明 PNG(源和目标)而不是 jpeg,它将使图像变平并使背景变为纯白色,您不希望这样吗?
您需要做的是确定图像是否具有或可能具有透明度,然后将背景颜色设置为无。使图像变平,因此在这些情况下-extent
,为了保持背景的透明度。None
(而且,如前所述,您当然需要使用 png 或 gif 输出而不是 jpg,因为 jpeg 无法处理透明度。)通常我会进行简单的扩展检查,因为它在大多数情况下已经足够好了,但还有更详细的检查。
$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);
==根据评论更新:==
对于那些在 6.5.7-8 之后得到这个答案并使用 imagemagick 的人,需要调整这个答案,使 extentImage x 和 y 值为负数。您可以在php.net/manual/en/imagick.extentimage.php上查看警告说明- 由 Jeff Richards 提供