ImageMagick两个版本对imagick合成图片的一点差异

第一次听说imagick,然后使用,强大到任性,任性到手册上资料也少,合成一张图毕竟还是很容易的。

本地执行完全OK,到了服务器上,没有任何输出,一点小问题,来源于版本。

/**
     *  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');
        $canvas -> setimageformat($img_type);
        $i = $j = 0;
        foreach ($img_list as $item) {
        	$im = null;
            $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, Imagick::COMPOSITE_OVER, $x, $y);
            $canvas -> compositeimage($im, $im->getImageCompose(), $x, $y);

            if (($i + 1) % $line_num === 0) {
                $i = 0;
                $j++;
            } else {
                $i++;
            }
            $im -> clear();
            $im -> destroy();
        }
        $canvas -> writeimage($output_url);
        $canvas -> clear();
        $canvas -> destroy();
    }

注意上面32行和43行:

$v = Imagick::getVersion();

Array

(

[versionNumber] => 1576

[versionString] => ImageMagick 6.2.8 05/07/12 Q16 file:/usr/share/ImageMagick-6.2.8/doc/index.html

)

版本6.2.8合成失败,解决方案:

一、修改32行为:

 $canvas -> compositeimage($im, Imagick::COMPOSITE_OVER, $x, $y);

二、修改43行为:

 $canvas -> writeimages($output_url,true);

对于版本6.5以上问题都不存在,目前最新版本6.9

时间: 2024-10-22 12:34:19

ImageMagick两个版本对imagick合成图片的一点差异的相关文章

ImageMagick编辑q8版本,支持多种图片格式

http://download.csdn.net/detail/u010026901/7642329 可以找到下载包 tar zxfv ImageMagick.tar.gz cd ImageMagick-6.9.0/ ./configure --with-quantum-depth=8,--with-jpeg=yes,--with-jp2=yes,--with-lcms=yes,--with-lcms2=yes,--with-lqr=yes,--with-png=yes,--with-rsvg=

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 */ p

ThinkPHP使用Imagick给图片加文字

在PHP处理文字的过程中,imagettftext是一个给图片添加水印的方式,可以动态指定字体.文字.大小,用起来比较方便: 在ThinkPHP中,可以方便地使用Imagick来完成相应的效果ImagickDraw.annotateImage,但是二者共同的问题是文字不能自动根据宽度换行: 解决的办法就是计算文字的宽度,并且重构字符串在一些地方加入\n符号 于是经过在网上的搜寻,整合出以下代码: /** * 返回一个字符的数组 * * @param $str 文字 * @param $chars

【裸单源最短路:Dijkstra算法两种版本】hdu 1874 畅通工程续

Source : hdu 1874 畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.

iOS合成图片

iOS进行合成方式,本人知道的又两种: 1:使用UIImage直接合成 方法:通过上下文将要合成的图片都绘制到该上下文,然后得到合成的图片 - (UIImage*)NTESATCOverlayWith:(UIImage*)overlayImage{ UIGraphicsBeginImageContext(self.size); [self drawAtPoint:CGPointZero]; [overlayImage drawInRect:CGRectMake(0, 0, self.size.w

PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例

function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( 'Ymd' ) . '/'; $img = $date . md5 ( $source . $text1 . $text2 . $text3 ) . '.jpg'; if (file_exists ( './' . $img )) { return $img; } $main = imagecrea

C++ HUSTR与两个版本的HUMAP实现

/* hustr是一个我使用很方便的字符串类,管理使用很方便, 新的humap支持多级存储各种信息,使用及其方便 旧的humap只支持字符串存储,使用方法一样 */ #include <stdio.h> #include <stdlib.h> #include <string> #include <map> #include <deque> #include <string.h> #include <stdarg.h> u

类定义下标操作符时,为什么需要定义两个版本

类定义下标操作符时,一般需要定义两个版本: 1. 作为类的非const成员函数,返回引用: 2. 作为类的const成员函数,返回const引用. 首先,什么是类的const成员函数,也就是不改变对象的成员函数.表示方法就是在类的成员函数的声明和定义后面加上const. 类的有些对象可能可以改变,有的不能改变,举个例子来说,对于string对象来说,有的我们可能希望定义的string对象可以改变,有的则不能改变: string str1= "abcdefg"; const string

git日志输出格式及两个版本之间差异列表

查看commit id git log --pretty=format:"%h" git log --pretty=format:"%H" 获取两个版本间差异的文件列表(最好是通过git log --pretty=format:"%H",获取完整的commit id,否则linux下有可能报错.) git diff e83228e d9878b88 --name-only 当前版本id git rev-parse HEAD 带目录结构复制文件 c