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
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
初级的用php写的采集程序
Mar 16 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP单链表的实现代码
Jul 05 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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上传图片类显示缩略图功能
2016/06/30 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
PHP强制转化的形式整理
2020/05/22 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
python:print格式化输出到文件的实例
2018/05/14 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
我未来的职业规划范文
2014/01/11 职场文书
校长寄语大全
2014/04/09 职场文书
水电维修专业推荐信
2014/09/06 职场文书
小学大队长竞选稿
2015/11/20 职场文书
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL