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 相关文章推荐
url decode problem 解决方法
Dec 26 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
May 08 PHP
php去除deprecated的实例方法
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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
Symfony查询方法实例小结
2017/06/28 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
js实现简单的打印表格
2020/01/15 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python实现的特征提取操作示例
2018/12/03 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python操作gitlab API过程解析
2019/12/27 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
交通安全演讲稿
2014/01/07 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android