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扩展ZF――Validate扩展
Jan 10 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
php读取der格式证书乱码解决方法
Jun 22 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
php错误日志简单配置方法
Jul 11 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
php去除数组中为0的元素的实例分析
Nov 17 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
当海贼王变成JOJO风
2020/03/02 日漫
编写自己的php扩展函数
2006/10/09 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
js单例模式的两种方案
2013/10/22 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python工程师面试必备25条知识点
2018/01/17 Python
对Python中的@classmethod用法详解
2018/04/21 Python
Django 路由控制的实现
2019/07/17 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
努比亚手机官网:nubia
2016/10/06 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
简单的项目建议书模板
2014/03/12 职场文书
小学生暑假家长评语
2014/04/17 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书