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 相关文章推荐
检查url链接是否已经有参数的php代码 添加 ? 或 &
Feb 09 PHP
php 定义404页面的实现代码
Nov 19 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 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中获取时间的下一周下个月的方法
2014/03/18 PHP
php字符串截取函数用法分析
2014/11/25 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python实现年会抽奖程序
2019/01/22 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
Python实现分数序列求和
2020/02/25 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
django使用多个数据库的方法实例
2021/03/04 Python
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
学生会副主席竞聘书
2014/03/31 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
公司副总经理任命书
2014/06/05 职场文书
个人德育工作总结
2015/03/05 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS