PHP利用imagick生成组合缩略图


Posted in PHP onFebruary 19, 2016

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

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 相关文章推荐
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php array_values 返回数组的值实例详解
Nov 17 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
php取出数组单个值的方法
Mar 12 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 PHP
对比分析php中Cookie与Session的异同
Feb 19 #PHP
php强大的时间转换函数strtotime
Feb 18 #PHP
php实现中文转数字
Feb 18 #PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 #PHP
php脚本运行时的超时机制详解
Feb 17 #PHP
PHP邮件群发机实现代码
Feb 16 #PHP
46 个非常有用的 PHP 代码片段
Feb 16 #PHP
You might like
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php实现文件下载实例分享
2014/06/02 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
python添加模块搜索路径方法
2017/09/11 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
python实现神经网络感知器算法
2017/12/20 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
啤酒销售实习自我鉴定
2013/09/24 职场文书
自我评价范文
2013/12/22 职场文书
团队队名口号大全
2014/06/06 职场文书
个人授权委托书范本
2014/09/14 职场文书
实名检举信范文
2015/03/02 职场文书