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二分法在IP地址查询中的应用
Aug 12 PHP
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
Web程序工作原理详解
Dec 25 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
使用XHGui来测试PHP性能的教程
Jul 03 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
thinkPHP引入类的方法详解
Dec 08 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
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数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
twig里使用js变量的方法
2016/02/05 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
JavaScript类库D
2010/10/24 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JavaScript闭包详解
2015/02/02 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
python win32 简单操作方法
2017/05/25 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
如何用python写个模板引擎
2021/01/14 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
int和Integer有什么区别
2013/05/25 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
幼儿发展评估方案
2014/06/11 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
考试后的感想
2015/08/07 职场文书
技术入股合作协议书
2016/03/21 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Python实现学生管理系统(面向对象版)
2021/06/24 Python
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS