先给大家炫下效果图,如果大家觉得还很满意,请继续往下阅读:
这里说的imagick 是 ImageMagick 在PHP下的扩展。使用pecl安装起来那叫一个轻松简单一条命令就搞定:
代码如下:
(扩展装好后还是要在PHP.ini中加上extension=imagick.so,然后记得重启apache或PHP-fpm服务。)
最近有个需求是要把多张图片组合起来生成缩略图,刚好用用这个强大的imagick扩展。
2.如果有2张图片,则一张在左边一张在右边,各一半;
3.如果有3张图片,则两张左边平均分配,一张独占右边;
4.如果有4张图片,则像田字格一样平均分配空间;
这规则还真不少,不过还不算太过复杂,很快搞出来了:
newImage($width,$height,'white','jpg');
$thumbnail->compositeImages($images);
return $thumbnail;
}
public function compositeImages($images){
$imagesKeys = array_keys($images);
$compositeConfig = $this->calcCompositeImagesPosAndSize($images);
foreach ($compositeConfig as $index => $cfg){
$imgKey = $imagesKeys[$index];
$img = new \Imagick($images[$imgKey]);
$img = $this->makeCompositeThumbnail($img,$cfg);
$this->compositeImage($img,self::COMPOSITE_OVER,$cfg['to']['x'],$cfg['to']['y']);
}
}
protected function makeCompositeThumbnail(\Imagick $img,$cfg){
$img->cropThumbnailImage($cfg['size']['width'],$cfg['size']['height']);
return $img;
}
protected function calcCompositeImagesPosAndSize($images){
$width = $this->getImageWidth();
$height = $this->getImageHeight();
switch(count($images)){
case 0:
throw new ThumbnailException("No images!");
case 1:
// | 0 |
return [
0 => [
'to' => [ 'x' => 0,'y' => 0 ],'size' => [
'width' => $width,'height' => $height,]
]
];
case 2:
// | 0 | 1 |
return [
0 => [
'to' => [ 'x' => 0,'size' => [
'width' => $width / 2,]
],1 => [
'to' => [ 'x' => $width / 2,'y' => 0],]
]
];
case 3:
// | 0 | 1 |
// | 2 | |
return [
0 => [
'to' => [ 'x' => 0,'height' => $height / 2,2 => [
'to' => [ 'x' => 0,'y' => $height / 2 ],];
default:
// >= 4:
// | 0 | 1 |
// | 2 | 3 |
return [
0 => [
'to' => [ 'x' => 0,3 => [
'to' => [ 'x' => $width / 2,'y' => $height / 2],];
}
}
}
用个试试:
代码如下:
writeImage($outputDir."/example.jpg");