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函数解决SQL injection
Dec 09 PHP
PHP与SQL注入攻击[三]
Apr 17 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
基于header的一些常用指令详解
Jun 06 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
php中socket通信机制实例详解
Jan 03 PHP
php设置页面超时时间解决方法
Sep 22 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
laravel5 Eloquent 实现事务方式
Oct 21 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python中异常重试的解决方案详解
2017/05/05 Python
机器学习python实战之决策树
2017/11/01 Python
Django forms组件的使用教程
2018/10/08 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python 寻找局部最高点的实现
2019/12/05 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
办公室年终个人自我评价
2013/10/28 职场文书
车间主管岗位职责
2013/11/14 职场文书
市场部专员岗位职责
2013/11/30 职场文书
校园绿化美化方案
2014/06/08 职场文书
真诚的求职信
2014/07/04 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
房屋租赁协议书
2014/10/18 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
初中美术教学反思
2016/02/17 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫