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);
4

1 回答 1

12

如果我正确地理解了您想要什么,那么您已经在那儿了。现在,如果您尝试使用透明 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,无论来源如何,它都会被剥夺透明度。有了这个,如果您提供$imgFiletest-transparent1.png 和$thumbnailFilenametest-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 提供

于 2013-03-03T04:38:25.800 回答