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程序中防止盗链
Apr 09 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
php实现字符串反转输出的方法
Mar 14 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
php中的登陆login实例代码
Jun 20 PHP
php中二分法查找算法实例分析
Sep 22 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 PHP
php递归函数怎么用才有效
Feb 24 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 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
php入门小知识
2008/03/24 PHP
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
python 获取list特定元素下标的实例讲解
2018/04/09 Python
python简单实现AES加密和解密
2019/03/28 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
Structs界面控制层技术
2013/10/11 面试题
应届医学毕业生求职信分享
2013/12/02 职场文书
党员承诺书格式
2014/05/21 职场文书
女生抽烟检讨书
2014/10/05 职场文书
2015年度保密工作总结
2015/04/24 职场文书
立项申请报告范本
2015/05/15 职场文书
放假通知怎么写
2015/08/18 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang