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 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
PHP新手上路(十二)
Oct 09 PHP
PHP重定向的3种方式
Mar 07 PHP
php画图实例
Nov 05 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php显示时间常用方法小结
2015/06/05 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
flask开启多线程的具体方法
2020/08/02 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
《商鞅南门立木》教学反思
2014/02/16 职场文书
北体毕业生求职信
2014/02/28 职场文书
个人合作协议书范本
2014/04/18 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
大学军训心得体会800字
2016/01/11 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js