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动态创建Flash动画
Oct 09 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
PHP实现的进度条效果详解
May 03 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
php实现websocket实时消息推送
Mar 30 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP代码覆盖率统计详解
Jul 22 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
Prototype Number对象 学习
2009/07/19 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
Python os模块学习笔记
2015/06/21 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Python使用gRPC传输协议教程
2018/10/16 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
应届生自荐信范文
2014/02/21 职场文书
协议书怎么写
2014/04/21 职场文书
选秀节目策划方案
2014/06/06 职场文书
体育课外活动总结
2014/07/08 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers