手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

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

首页 > PHP >

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

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

PHP代码
  1. <?php  
  2. $animation = new Imagick();  
  3. $animation->setFormat( "gif" );  
  4. for ($i=1; $i<4; $i++) {  
  5.     $thisimage = new Imagick();  
  6.     $thisimage->readImage($i.'.png');  
  7.     $thisimage->setImageFormat( "gif" );  
  8.     $animation->addImage($thisimage);  
  9.     $animation->setImageDelay(1000);  
  10. }  
  11. header( "Content-Type: image/gif" );  
  12. echo $animation->getImagesBlob();  

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

PHP代码
  1. <?php  
  2. $image=new Imagick();  
  3. $animation = new Imagick(); //建立一个对象。  
  4. $animation->setFormat( "gif" ); //设置它的类型。  
  5. $delay = 30; //设置播放速度。  
  6.   
  7. for ($i=1; $i<4; $i++) {  
  8.     $thisimage = new Imagick();  
  9.     $thisimage->readImage($i.'.jpg'); //我有三个图片分别叫:1.jpg,2.jpg,3.jpg 就是要合成他们三个。  
  10.     $thisimage->setFormat( "gif" ); //把他们都转成GIF格式。  
  11.     $animation->addImage($thisimage); //加入到刚才建立的那个gif imagick对象之中。  
  12.     $animation->setImageDelay( $delay ); //设置好播放速度。  
  13. }  
  14.   
  15. header( "Content-Type: image/gif" );  
  16. $animation->writeImages("9.gif",true); //文件存储。  

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

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

PHP代码
  1. <?php  
  2. $filelist = array(  
  3.     '1.jpg',  
  4.     '2.jpg',  
  5.     '3.jpg'  
  6. );  
  7.   
  8. $animation = new Imagick(); //create animation object  
  9. $animation->setFormat('gif'); // set file type  
  10.   
  11. foreach ( $filelist as $file ){  
  12.     $image = new Imagick();  
  13.     $image->readImage( $file );  
  14.     $animation->addImage( $image );  
  15.     $animation->setImageDelay(60);    
  16.     unset( $image );  
  17. }  
  18. header( "Content-Type: image/gif" );   
  19. echo$animation->getImagesBlob() );  
  20. //$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的代码




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: imagick, gif

« 上一篇 | 下一篇 »

只显示10条记录相关文章

Imagick DLL (浏览: 34086, 评论: 6)
服务器正式启用ImagIck组件 (浏览: 31397, 评论: 6)
关于Imagick的使用 (浏览: 31029, 评论: 3)
JS模拟FLASH效果 (浏览: 23860, 评论: 0)

3条记录访客评论

你好,今天也遇到了这个不循环问题,通过google找到了这里。您有办法解决吗?静候佳音

-----
我文章内容是解决了这个问题的。

Post by 寻宝人 on 2012, February 15, 7:47 PM 引用此文发表评论 #1

4、至于为什么在使用header设定文件头和echo 输出后图片没有动,我目前怀疑这是浏览器的设定关系,因为,你右键点击生成的图片另存下来时,图片是可以正常的跳动的。
你看一下是不是这个原因。你存下来的图片可以正常跳动后,然后随便新建一个HTML文件,把这个image,用Src引用一下,看看,是否正常跳动?

Post by gouki on 2010, April 23, 2:59 PM 引用此文发表评论 #2

您好 这个生成出来的GIF图片在浏览器中只能循环一边,但是保存到本地用软件打开的话可以无限循环。
但我合成的图片要放到WEB上的,请问这个问题如何解决,现在你有办法解决了么。我的邮箱ktu5@hotmail.com 静候佳音
这个问题应该不是浏览器的问题

Post by 大鹏 on 2010, April 23, 9:21 AM 引用此文发表评论 #3


发表评论

评论内容 (必填):