PHP利用imagick生成组合缩略图

 更新时间:2016年02月19日 13:48:02   转载 作者:Clarence_Pan  
这里说的imagick 是 ImageMagick 在PHP下的扩展,本文给大家介绍PHP利用imagick生成组合缩略图,需要的朋友参考下

先给大家炫下效果图,如果大家觉得还很满意,请继续往下阅读:

这里说的imagick 是 ImageMagick 在PHP下的扩展。使用pecl安装起来那叫一个轻松简单一条命令就搞定:

复制代码 代码如下:

sudo pecl install imagick

(扩展装好后还是要在php.ini中加上extension=imagick.so,然后记得重启apache或php-fpm服务。)

最近有个需求是要把多张图片组合起来生成缩略图,刚好用用这个强大的imagick扩展。

这个需求是要这样生成缩略图:

1.如果有1张图片,就直接生成这张图片的缩略图;

2.如果有2张图片,则一张在左边一张在右边,各一半;

3.如果有3张图片,则两张左边平均分配,一张独占右边;

4.如果有4张图片,则像田字格一样平均分配空间;

5.更多张图片,则只取前4张,按田字格方式生成缩略图。

这规则还真不少,不过还不算太过复杂,很快搞出来了:

namespace \clarence\thumbnail;
class Thumbnail extends \Imagick
{
/**
* @param array $images
* @param int $width
* @param int $height
* @return static
* @throws ThumbnailException
*/
public static function createFromImages($images, $width, $height){
if (empty($images)){
throw new ThumbnailException("No images!");
}
$thumbnail = new static();
$thumbnail->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, 'y' => 0 ],
'size' => [
'width' => $width / 2,
'height' => $height,
]
],
1 => [
'to' => [ 'x' => $width / 2, 'y' => 0],
'size' => [
'width' => $width / 2,
'height' => $height,
]
]
];
case 3:
// | 0 | 1 |
// | 2 | |
return [
0 => [
'to' => [ 'x' => 0, 'y' => 0 ],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
1 => [
'to' => [ 'x' => $width / 2, 'y' => 0],
'size' => [
'width' => $width / 2,
'height' => $height,
]
],
2 => [
'to' => [ 'x' => 0, 'y' => $height / 2 ],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
];
default:
// >= 4:
// | 0 | 1 |
// | 2 | 3 |
return [
0 => [
'to' => [ 'x' => 0, 'y' => 0 ],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
1 => [
'to' => [ 'x' => $width / 2, 'y' => 0],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
2 => [
'to' => [ 'x' => 0, 'y' => $height / 2 ],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
3 => [
'to' => [ 'x' => $width / 2, 'y' => $height / 2],
'size' => [
'width' => $width / 2,
'height' => $height / 2,
]
],
];
}
}
}

用个试试:

复制代码 代码如下:

$thumbnail = \clarence\thumbnail\Thumbnail::createFromImages($srcImages, 240, 320);
$thumbnail->writeImage($outputDir."/example.jpg");

以上内容给大家介绍了PHP利用imagick生成组合缩略图的相关知识,希望对大家有所帮助!

相关文章

  • 基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解

    基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解

    本篇文章是对PHP字符串的比较函数strcmp()与strcasecmp()的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ThinkPHP防止重复提交表单的方法实例分析

    ThinkPHP防止重复提交表单的方法实例分析

    这篇文章主要介绍了ThinkPHP防止重复提交表单的方法,结合实例形式分析了thinkPHP防止重复提交表单的各种常见操作技巧与相关注意事项,需要的朋友可以参考下
    2018-05-05
  • 利用PHP实现一个简单的用户登记表示例

    利用PHP实现一个简单的用户登记表示例

    这篇文章主要给大家介绍了利用PHP实现一个简单的用户登记表的相关资料,文中分别介绍了如何展示单行和多行信息表的实现方法,分别给出了详细的示例代码,需要的朋友可以参考简介,下面来一起看看吧。
    2017-04-04
  • PHP实现生成唯一编号(36进制的不重复编号)

    PHP实现生成唯一编号(36进制的不重复编号)

    这篇文章主要介绍了PHP实现生成唯一编号,文中使用10进制转换36进制得到不重复的6000多万个唯一编号,编号位数为10位,需要的朋友可以参考下
    2014-07-07
  • PHP微信公众号自动发送红包API

    PHP微信公众号自动发送红包API

    微信发红包已经成为当今比较流行的祝福形式,大家都学着使用微信发红包,这篇文章主要为大家详细介绍了PHP微信公众号自动发送红包API,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Laravel框架控制器,视图及模型操作图文详解

    Laravel框架控制器,视图及模型操作图文详解

    这篇文章主要介绍了Laravel框架控制器,视图及模型操作,结合实例形式详细分析了laravel框架控制器,视图及模型的基本功能、原理与相关操作使用技巧,需要的朋友可以参考下
    2019-12-12
  • PHP实现WebService的简单示例和实现步骤

    PHP实现WebService的简单示例和实现步骤

    这篇文章主要介绍了PHP实现WebService的简单示例和实现步骤,本文直接给出示例代码并分步骤讲解,需要的朋友可以参考下
    2015-03-03
  • PHP、Java des加密解密实例

    PHP、Java des加密解密实例

    这篇文章主要介绍了PHP、Java des加密解密实例,des加密是对称加密中在互联网应用的比较多的一种加密方式,本文分别给出了PHP和JAVA版本的实现代码,需要的朋友可以参考下
    2015-04-04
  • php文件上传的例子及参数详解

    php文件上传的例子及参数详解

    这篇文章主要介绍了php文件上传的例子及参数,有需要的朋友可以参考一下
    2013-12-12
  • php中stream(流)的用法

    php中stream(流)的用法

    Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,下面是使用方法
    2014-03-03

最新评论