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 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
php的declare控制符和ticks教程(附示例)
Mar 21 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
Yii框架日志记录Logging操作示例
Jul 12 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数组应用之比较两个时间的相减排序
2008/08/18 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
Jquery常用技巧收集整理篇
2010/11/14 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python zip文件 压缩
2008/12/24 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
建筑安全责任书范本
2014/07/24 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS