标签:imagick

浏览模式: 标准 | 列表 | 图文
pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

一大早pengyuan就和我说了一些用多张图片合并成一个GIF的方案,他使用了我前段时间博客里提到的imagick的组件。

然后把代码贴给我看了一下。
这是他第一次的代码:

<?php
$animation = new Imagick();
$animation->setFormat( "gif" );
for ($i=1; $i<4; $i++) {
$thisimage = new Imagick();
$thisimage->readImage($i.'.png');
$thisimage->setImageFormat( "gif" );
$animation->addImage($thisimage);
$animation->setImageDelay(1000);
}
header( "Content-Type: image/gif" );
echo $animation->getImagesBlob();

然后,他发现图片怎么也没有动,于是有了第二次的代码:

<?php
$image=new Imagick();
$animation = new Imagick(); //建立一个对象。
$animation->setFormat( "gif" ); //设置它的类型。
$delay = 30; //设置播放速度。

for ($i=1; $i<4; $i++) {
$thisimage = new Imagick();
$thisimage->readImage($i.'.jpg'); //我有三个图片分别叫:1.jpg,2.jpg,3.jpg 就是要合成他们三个。
$thisimage->setFormat( "gif" ); //把他们都转成GIF格式。
$animation->addImage($thisimage); //加入到刚才建立的那个gif imagick对象之中。
$animation->setImageDelay( $delay ); //设置好播放速度。
}

header( "Content-Type: image/gif" );
$animation->writeImages("9.gif",true); //文件存储。

在这样的情况下,他发现GIF图片可以动了。看来保存成功了。

根据他写的代码,我作了一个小小的测试:

<?php
$filelist = array(
'1.jpg',
'2.jpg',
'3.jpg'
);

$animation = new Imagick(); //create animation object
$animation->setFormat('gif'); // set file type

foreach ( $filelist as $file ){
$image = new Imagick();
$image->readImage( $file );
$animation->addImage( $image );
$animation->setImageDelay(60);
unset( $image );
}
header( "Content-Type: image/gif" );
echo( $animation->getImagesBlob() );
//$animation->writeImages( time().".gif" ,true );

代码几乎没变,除了在readImage行下面那个setFormat函数去掉了。同样生成了GIF图片,现在我把问题和解决情况和大家说一下,也希望大家少走点弯路吧

1、在animation里设置好setFormat为gif后,其他地方可以不需要设,因为最终都是通过 $animation->addImage 进入载入图片的,所以载进来肯定是GIF了
2、$animation->setImageDelay( 60 ) ,这个设置帧数的设定只能在每次AddImage后才能设定,否则会报错:没有加载图片时不能设定帧数
3、$animation->writeImages函数,不能使用writeImage,因为是多帧的,它会认为是多张图片
4、至于为什么在使用header设定文件头和echo 输出后图片没有动,我目前怀疑这是浏览器的设定关系,因为,你右键点击生成的图片另存下来时,图片是可以正常的跳动的。

解决完毕。感谢pengyuan的代码

Imagick DLL

Imagick DLL

这个DLL,是我以前写的另外一篇博客里介绍过的东西,在这篇博客里,有多个朋友回复需要此文件,也曾通过邮件发送过给某位网友,为了更方便的提供,现在将这个DLL上传。
使用方法很简单,在window下面直接拷到PHP所在目录的ext目录下
然后到php.ini里,在extenstion区块里加上extension=....dll(文件名太长,记不往)
尽量放到最后加载
如果有可能,请先加载mbstring,iconv等unicode支持库

如果运行 失败,尝试到命令行下运行 ,看看出错信息是什么。

服务器正式启用ImagIck组件

服务器正式启用ImagIck组件

Imagick的DLL在windows上本来无法装上,前面一篇博客里介绍说团队好友hihiyou帮忙找了一个DLL,可以用在PHP 5.2.X上面的,今天一大早COPY到服务器上,并扩展出来。。

看图说话,OH YEAH。可惜。。。sablog不支持Imagick,它还是用GD的,不知道新版本会不会采用。

好象小图看不太清楚。还是点击一下看大图吧。。。

bf5f25320761a63689623a9837d29c0f

关于Imagick的使用

关于Imagick的使用

ImagIck这个控件应该算是最近两年来,各个WEB程序员都比较推荐的一个编辑图片的软件。
其实这也是一个分支吧?如果我没有记错,都是从XXX(忘了是哪个了)分出来的,一个是MagickWand,另一个就是这个Imagick了,只是MagicWand好象比较难以控制,并不如这个Imagick方便,再加上Imagick的类及使用方法也集成在PHP手册里了。

本来我是安装了ImageMagick-6.2.5-4-Q16-windows-dll.exe的,然而,愿望总是美好的,结果在Apache下运行的时候,总是提示挂接不上某个动态链接库,装回5.5.7后一切正常,但却无法使用PHP手册里所提供的函数。

本来都想放弃了,可是同事在单位里的Linux上装上了这个软件,但由于我们的PHP版本太低,在大多数的情况下都是直接使用命令行进行操作的。

为了适应将来的PHP版本升级,所以不得不学习这个软件,在我以前的贴子里,也贴过了Imagick官网和一些例子的实现网站。
今后我也会重新拾起代码,尽量、争取把官网的例子也逐步一一实现,或者大部分常用的实现一下。

感谢团队好友hihiyou(http://www.hihiyou.com)为我找了一个可以在windows下使用的Imagick的DLL,可以让我开始学习它。

先来个例子,黑黑。。。

<?php
header('Content-type: image/gif');

$image = new Imagick('google_logo.gif');
$image->adaptiveResizeImage(400,NULL);

echo $image;
?>

原图:

8a492ca623e502fdb5f1f2c670b762bc

重生成:

100c82ece1001fa013ac8de7fe0ae4b4