Php 使用垂直和水平图像的背景填充调整图像大小

Php 使用垂直和水平图像的背景填充调整图像大小,php,imagemagick,Php,Imagemagick,我正在尝试创建一个图像库。这次我想尝试使用PHP图像Magick 上传文件时,我希望将其大小调整为1024x724。如果图像是垂直的(宽度高度),同样适用 以下是我目前的代码: $img = new Imagick($targetFile); $img->scaleImage(1024,724); $img->setGravity(imagick::GRAVITY_CENTER); $img->setImageBackgroundColor('white'); $img->

我正在尝试创建一个图像库。这次我想尝试使用PHP图像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);

如果我正确地理解了你想要什么,那么你已经成功了。现在,如果你尝试使用一个透明的PNG(源和目标),而不是jpeg,它会使图像变平并使背景纯白,你不想这样做吗

您需要做的是确定图像是否具有或可能具有透明度,然后将背景色设置为“无”
-extent
将图像展平,因此在这些情况下,为了保持透明度,背景必须为
None
。(如前所述,您当然需要使用png或gif输出,而不是jpg输出,因为jpeg无法处理透明度。)通常,我会做简单的扩展检查,因为它在大多数情况下都足够好

我在这里检查输出缩略图,因为如果输出到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);

不确定其余的命令行参数,但如果您想要web可视的透明度,则必须使用.png或.gif。Jpeg格式不支持透明度。还有一件事。这可以用php类完成吗?我的意思是像$img=newimagick('test.jpg');$img=调整到2014x 724之类的?如果你理解我的意思是,那在Imagick类中应该是可行的。特别是,请查看
scaleImage
setImageBackgroundColor
setGravity
extentImage
方法的手动条目。好的,我编辑了我的文章,它重新调整了图像的大小,但没有保留Aspect比率。你能帮我解释一下我的错误吗?我对Imagick课程不太熟悉,所以我推迟了一点回复你。很抱歉。无论如何,希望我刚才编辑的示例代码对我的答案有帮助。好的,我们就快到了,只有重力s…t。它总是将图像设置为150x150,但即使我放置$img->setGravity(imagick::GRAVITY\u CENTER),图像仍位于左侧;
<?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);