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
抓取YAHOO股票报价的类
May 15 PHP
php学习之 数组声明
Jun 09 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
浅析PHP Socket技术
Aug 02 PHP
配置php网页显示各种语法错误
Sep 23 PHP
php使用反射插入对象示例分享
Mar 11 PHP
php调用shell的方法
Nov 05 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
解析WordPress中的post_class与get_post_class函数
Jan 04 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 PHP
PHP7 其他语言层面的修改
Mar 09 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/07/17 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python中http请求方法库汇总
2016/01/06 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
公司应聘自荐书
2014/06/14 职场文书
维稳工作情况汇报
2014/10/27 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
党员发展大会主持词
2015/07/03 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
检讨书之工作不认真
2019/08/14 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis