PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】


Posted in PHP onNovember 14, 2017

本文实例讲述了PHP基于imagick扩展实现合成图片的两种方法。分享给大家供大家参考,具体如下:

方法一:compositeimages

/**
* function: 合成图片
* @param string   $output_url 图片保存路径
* @param string   $img_type  图片保存类型
* @param integral  $line_num  每行显示图片数量
* @param array    $logo_info 每张待合成图片的信息(要求所有尺寸统一)
* @param array    $img_list 待合成的图片绝对路径
*
* @return void
*/
public function generate($output_url, $img_type, $line_num, $logo_info, $img_list=array()) {
    //计算图片有多少行
    $lines = ceil(count($img_list)/$line_num);
    $bg_width = ($logo_info['width'] + $logo_info['line_width']) * $line_num;
    $bg_height = ($logo_info['height'] + $logo_info['line_height']) * $lines;
    //构建画布
    $canvas = new Imagick();
    $canvas->newimage($bg_width, $bg_height, 'white');
    $canvas->setimageformat($img_type);
    $i = $j = 0;
    foreach ($img_list as $item) {
      $im = new Imagick($item);
      $x = $logo_info['line_width']*2 + $i * $logo_info['width'];
      $y = $logo_info['line_height']*2 + $j * $logo_info['height'];
      // $canvas->compositeimage($im -> getimage(), Imagick::COMPOSITE_OVER, $x, $y);
      $canvas -> compositeimage($im, $im->getImageCompose(), $x, $y);
      if (($i + 1) % $line_num === 0) {
        $i = 0;
        $j++;
      } else {
        $i++;
      }
      // unset($im);
      $im -> destroy();
    }
    $canvas->writeimage($output_url);
    //销毁对象
    $canvas -> destroy();
}

方法二:combineimages

/**
* function: 合成图片
* @param string   $output_url 图片保存路径
* @param string   $img_type  图片保存类型
* @param integral  $line_num  每行显示图片数量
* @param array    $logo_info 每张待合成图片的信息(要求所有尺寸统一)
* @param array    $img_list 待合成的图片绝对路径
*
* @return void
*/
public function generate($output_url, $img_type, $line_num, $logo_info, $img_list=array()) {
    //计算图片有多少行
    $lines = ceil(count($img_list)/$line_num);
    $bg_width = ($logo_info['width'] + $logo_info['line_width']) * $line_num;
    $bg_height = ($logo_info['height'] + $logo_info['line_height']) * $lines;
    //构建画布
    $canvas = null;
    $canvas = new Imagick();
    $canvas -> newimage($bg_width, $bg_height, 'white');
    $i = $j = 0;
    foreach ($img_list as $item) {
      $im = null;
      $im = new Imagick($item);
      // $canvas -> readImage($item);
      $canvas -> addimage($im);
      $im -> clear();
      $im -> destroy();
    }
    // $canvas -> flattenImages();
    $canvas -> combineImages( Imagick::CHANNEL_ALL );
    $canvas -> writeimage($output_url);
    //销毁对象
    $canvas -> clear();
    $canvas -> destroy();
}

个人认为方法二效率更高

附:windows下面php5.2.17和php5.3.18和php5.4.8各个版本的imagick组件下载

1、PHP5.2.17我安装成功了,用的星外PHP5.2.17直接安装程序,下载imagick版本如下:

点击此处本站下载

已经包含imagemagick不需要安装任何东西,直接把php_imagick_st-Q16.dll复制到c:\php\ext目录
然后给php.ini扩展里面增加:extension=php_imagick_st-Q16.dll 最简单和绿色的方法
ps:还有诸如php_imagick_st-Q8.dll(8色),php_imagick_dyn-Q16.dll(需要安装imagemagick)就完全没必要管他们了

PHP5.2.17本站下载地址:

32位:https://3water.com/softs/26087.html

64位:https://3water.com/softs/479475.html

2、PHP5.3.18 必须安装 imagemagick 已经没有可用的单文件dll了

1)官方下载地址:

http://www.imagemagick.org/download/binaries/ImageMagick-6.8.0-4-Q16-windows-dll.exe

2)根据你的php安装模式下载 php_imagick

线程安全:

点击此处本站下载

复制到c:\php\ext目录,增加扩展例如:extension=php_imagick_nts.dll

3、PHP5.4.8  必须安装 imagemagick 已经没有可用的单文件dll了

1)官方下载地址:

http://www.imagemagick.org/download/binaries/ImageMagick-6.8.0-4-Q16-windows-dll.exe

2)根据你的PHP安装模式下载 php_imagick

无线程安全:

点击此处本站下载

复制到c:\php\ext目录,增加扩展例如:extension=php_imagick.dll

以上安装本人都测试过,安装了重启iis或Apache服务器,然后查看phpinfo看看有没有 imagick 如果没有的话,请检查权限或者重新做一次。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP查询域名状态whois的类
Nov 25 PHP
php 无限级缓存的类的扩展
Mar 16 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
Yii清理缓存的方法
Jan 06 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 #PHP
PHP中递归的实现实例详解
Nov 14 #PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 #PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 #PHP
浅谈PHP中如何实现Hook机制
Nov 14 #PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 #PHP
PHP封装的XML简单操作类完整实例
Nov 13 #PHP
You might like
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP整合PayPal支付
2015/06/11 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Javascript开发包大全整理
2006/12/22 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
理解javascript封装
2016/02/23 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
python对html代码进行escape编码的方法
2015/05/04 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python模块 _winreg操作注册表
2020/02/05 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
四川成都导游欢迎词
2014/01/18 职场文书
教育学习自我评价
2014/02/03 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
担保书格式及范文
2014/04/01 职场文书
企业诚信承诺书
2014/05/23 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
英语专业自荐书
2014/06/13 职场文书
销售人才自我评价范文
2014/09/27 职场文书
北京故宫的导游词
2015/01/31 职场文书
教师个人年终总结
2015/02/11 职场文书
会计试用期自我评价
2015/03/10 职场文书
节约用电通知
2015/04/25 职场文书
导游词之包公祠
2019/11/25 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
python代码实现扫码关注公众号登录的实战
2021/11/01 Python