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模块memcache和memcached区别分析
Jun 14 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
使用php实现截取指定长度
Aug 06 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
php类自动加载器实现方法
Jul 28 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
php简单实现数组分页的方法
Apr 30 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php实例分享之二维数组排序
2014/05/15 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
python并发2之使用asyncio处理并发
2017/12/21 Python
python实现用户答题功能
2018/01/17 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python实现自动发送邮件
2018/06/20 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
django API 中接口的互相调用实例
2020/04/01 Python
python 5个顶级异步框架推荐
2020/09/09 Python
python空元组在all中返回结果详解
2020/12/15 Python
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
派出所所长先进事迹
2014/05/19 职场文书
应聘会计求职信
2014/06/11 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
公司员工离职感言
2015/08/03 职场文书
《所见》教学反思
2016/02/23 职场文书
优秀员工演讲稿
2019/06/21 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL