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 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
PHP+MySQL修改记录的方法
Jan 21 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
php格式文件打开的四种方法
Feb 24 PHP
php微信开发之图片回复功能
Jun 14 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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流量统计功能的实现代码
2012/09/29 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP学习记录之数组函数
2018/06/01 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
Python验证企业工商注册码
2015/10/25 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python编程实现蚁群算法详解
2017/11/13 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python当中的array数组对象实例详解
2019/06/12 Python
python实现宿舍管理系统
2019/11/22 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
python+OpenCV实现图像拼接
2020/03/05 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
实习公司领导推荐函
2014/05/21 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python