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程序
Oct 09 PHP
怎样才能成为PHP高手?学会“懒惰”的编程
Dec 05 PHP
php获取某个目录大小的代码
Sep 10 PHP
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
Dec 29 PHP
php与mysql建立连接并执行SQL语句的代码
Jul 04 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
PHP递归删除目录几个代码实例
Apr 21 PHP
示例详解Laravel的注册重构
Aug 14 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 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
编译问题
2006/10/09 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
用 JSON 处理缓存
2007/04/27 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
详解实现vue的数据响应式原理
2021/01/20 Vue.js
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
AJAX的优缺点都有什么
2015/08/18 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
服装厂厂长职责
2013/12/16 职场文书
投资合作协议书范本
2014/04/17 职场文书
政风行风建设责任书
2014/07/23 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android