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 相关文章推荐
火车头采集器3.0采集图文教程
Mar 17 PHP
php5数字型字符串加解密代码
Apr 24 PHP
php SQL Injection with MySQL
Feb 27 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
php无限级评论嵌套实现代码
Apr 18 PHP
PHP微信支付结果通知与回调策略分析
Jan 10 PHP
PHP的cookie与session原理及用法详解
Sep 27 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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 memcache扩展的三种安装方法
2009/04/26 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python urlopen 使用小示例
2008/09/06 Python
Python易忽视知识点小结
2015/05/25 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
纽约海:Sea New York
2018/11/04 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
小学生自我鉴定
2013/10/12 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
党纪处分决定书
2015/06/24 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫