为竖向和横向图片调整尺寸并填充背景色

6
我想创建一个图库,这次我想使用PHP Image Magick。当上传文件时,我希望将其调整为1024x724。如果图像是竖直的(宽度<高度),我希望它适合于图像中心,并且在应该为空白的两侧具有透明背景(或白色,如果不可能),以便图像始终为1024x724并保持纵横比。如果图像是水平的(宽度>高度),同样适用。以下是我的代码:
$img = new Imagick($targetFile);
$img->scaleImage(1024,724);
$img->setGravity(imagick::GRAVITY_CENTER);
$img->setImageBackgroundColor('white');
$img->extentImage(1024,724,0,0);

$img->writeImage($targetFile);

$img = new Imagick($targetFile);
$img->scaleImage(150,150);
$img->setGravity(imagick::GRAVITY_CENTER);
$img->setImageBackgroundColor('white');
$img->extentImage(150,150,0,0);

$img->writeImage($targetThumb);

不确定其他命令行参数,但如果您想要可在Web上查看的透明度,则必须选择.png或.gif格式。 Jpeg格式不支持透明度。 - Patrick M
1个回答

13

如果我正确理解了您的意思,您已经完成了一部分。现在,如果您尝试使用透明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的bestfit参数设置为true。此外,当使用API时,extentImage似乎根本不使用gravity选项,因此我们必须使用负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提供


还有一件事。这个能用PHP类完成吗? 我的意思是像 $img = new Imagick('test.jpg'); 然后 $img = resize 到 2014x724,类似这样的操作?如果你明白我的意思。 - Izopi4a
是的,使用Imagick类应该是可行的。特别是要查看scaleImagesetImageBackgroundColorsetGravityextentImage方法的手册条目。 - EPB
我对Imagick类不是很熟悉,所以回复你有点拖延了。非常抱歉。无论如何,希望我刚刚编辑到答案中的示例代码能够有所帮助。 - EPB
我不得不亲自调查这个问题,写了一个示例。我找到了这个并将其调整为居中显示,而不是南部显示。https://dev59.com/pFbUa4cB1Zd3GeqPAql2 - EPB
对于那些使用6.5.7-8版本之后的ImageMagick的人来说,这个答案需要进行调整,以便extentImage x和y值为负数。您可以在http://php.net/manual/en/imagick.extentimage.php上看到警告提示。 - Jeff Richards
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接