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 相关文章推荐
实现树状结构的两种方法
Oct 09 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
php根据生日计算年龄的方法
Jul 13 PHP
php自动识别文字编码并转换为目标编码的方法
Aug 08 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 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获取网络文件的实现代码
2010/01/01 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
pymongo中group by的操作方法教程
2019/03/22 Python
python3对接mysql数据库实例详解
2019/04/30 Python
Python进度条的制作代码实例
2019/08/31 Python
Django通过json格式收集主机信息
2020/05/29 Python
css3的transition属性详解
2014/12/15 HTML / CSS
车间班组长的职责
2013/12/13 职场文书
心得体会怎么写
2013/12/30 职场文书
团组织关系介绍信
2014/01/12 职场文书
初中生自我鉴定
2014/02/04 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
厨师长岗位职责
2014/03/02 职场文书
大学校务公开实施方案
2014/03/31 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
拾金不昧感谢信
2015/01/21 职场文书
催款函怎么写
2015/06/24 职场文书
2019各种保证书范文
2019/06/24 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python