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();
    }

个人认为方法二效率更高

时间: 2024-11-15 00:50:49

php imagick 扩展合成图片的两张方法的相关文章

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

扩展easyui validatebox的两个方法.移除验证和还原验证

[javascript] view plaincopy $.extend($.fn.validatebox.methods, { remove: function(jq, newposition){ return jq.each(function(){ $(this).removeClass("validatebox-text validatebox-invalid").unbind('focus.validatebox').unbind('blur.validatebox'); })

UIImage加载图片的两种方法区别

Apple官方的文档为生成一个UIImage对象提供了两种方法加载图片: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路径. 那么两种有什么区别吗? 肯定是有的.根据Apple的官方文档: imageNamed: 这 个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话.如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这 个对象.因此imageNamed的优点是当加载时会缓存图

dflatex插入EPS格式图片的两种方法

1. 将eps图片转成pdf或者将pdf图片转成eps,也就是说一张图片有pdf.eps两种格式.方法一:\includegraphics{pic} %不要扩展名.这样pdflatex自动调相应的pdf文件,而latex自动调eps文件. 方法二:先加入epstopdf宏包(epstopdf宏包的详细信息可查看--):\usepackage{graphicx}\usepackage{epstopdf}再用:\includegraphics{pic.eps} %可以包含eps扩展名,但是必须同时有

VC下加载JPG/GIF/PNG图片的两种方法

转载自:http://blog.sina.com.cn/s/blog_6582aa410100huil.html 仅管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是常常要用 到的.这里我给大家介绍两种办法来操作这些格式的图片. 1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture函数实际上创建了一个IP

python 读取并显示图片的两种方法

在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. 显示图片 import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读取图片 import numpy as np lena = mpimg.imread('lena.png')

android 图片叠加效果——两种方法的简介与内容 ,带解决Immutable bitmap passed to Canvas constructor错误

第一种是通过canvas画出来的效果: [java] view plaincopyprint? public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true); Bi

android 图片叠加效果——两种方法

效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true); Bitmap bitmap2

读取图片的两种方法

*读取图片的方法: *[UIImage imageNamed:filename]:通过图片名称加载会缓存图片,使用完成后不会释放,占用内存 *UIImage imageWithContentsOfFile:path:通过文件路径加载,不会缓存图片,使用完后自动释放 建议较多图片使用imageWithContentsOfFile: 加载图片