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单例模式实现(对象只被创建一次)
Dec 05 PHP
php数组去重实例及分析
Nov 26 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
PHP判断密码强度的方法详解
May 26 PHP
php curl操作API接口类完整示例
May 21 PHP
php fread函数使用方法总结
May 28 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
python实现simhash算法实例
2014/04/25 Python
Python实现基于HTTP文件传输实例
2014/11/08 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
酒店销售经理岗位职责
2014/01/31 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
青年文明号服务承诺
2014/03/31 职场文书
会计个人实习计划书
2014/08/15 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
公司感谢信范文
2015/01/22 职场文书
2015年护士节活动总结
2015/02/10 职场文书
医学会议开幕词
2016/03/03 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
python装饰器代码解析
2022/03/23 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
正则表达式基础与常用验证表达式
2022/06/16 Javascript