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 显示客户端IP与服务器IP的代码
Oct 12 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
Symfony2 session用法实例分析
Feb 04 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PDO::_construct讲解
Jan 27 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
php 动态添加记录
2009/03/10 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
php生成zip文件类实例
2015/04/07 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
Python计算一个文件里字数的方法
2015/06/15 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
python实现人民币大写转换
2018/06/20 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python中必要的名词解释
2019/11/20 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
如何选择使用结构还是类
2014/05/30 面试题
最美护士演讲稿
2014/08/27 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
出差报告格式模板
2014/11/06 职场文书
入党函调证明材料
2014/12/24 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS