我正在尝试创建一个图库。我想用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);
答案 0 :(得分:12)
如果我理解你想要什么,你就已经在那里了。现在,如果您尝试使用透明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的bestfit参数设置为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提供