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 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 PHP
PHP dirname简单使用代码实例
Nov 13 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 动态添加记录
2009/03/10 PHP
php支付宝接口用法分析
2015/01/04 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
vue权限管理系统的实现代码
2019/01/17 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python 没有main函数的原因
2020/07/10 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
JPA面试常见问题
2016/11/14 面试题
什么是属性访问器
2015/10/26 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
《最可爱的人》教学反思
2014/02/14 职场文书
建筑工地质量标语
2014/06/12 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL