Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2998156
  • 博文数量: 82
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-14 00:01
文章分类

全部博文(82)

文章存档

2014年(1)

2011年(1)

2009年(8)

2008年(11)

2007年(13)

2006年(26)

2005年(22)

我的朋友

分类:

2006-11-13 23:39:48

    Imagemagick是一个可以提供图像处理的SDK,在使用Imagemagick的过程中,我发现了几个比较有意思的函数MagickAddImage,MagickGetImageIndex,MagickSetImage,MagickSetImageIndex,MagickSetImageDelay等等。这些函数可以用来处理gif动画图像,比如可以提取gif89a文件的各帧以重新生成新的单帧图片文件,或者合并数个单帧的图片文件生成gif89a动画文件并且设置帧之间的间隔时间。
    一直认为gif文件是非常简单的所以从来没有仔细阅读过gif文件的规范,现在面临需要将gif动画文件的每一帧提取出来,单独跟其他图像元素合成,之后再生成gif动画。因此想当然的利用上述SDK进行,这时发现一个未曾察觉的问题,通常认为:假定一个2帧的128*128动画,那么每一帧都是128*128大小,然而,事实上,有不少gif作品,为了减少整个文件的体积,后边几帧只含有跟第一帧不相同的那部分数据,在这个时候,利用Imagemagick,包括CxImage等大众化的图像SDK,抽取第二帧图片并生成单独的文件(非gif格式),就会发觉该文件大小已经不是128*128,而是小于该数值,如果生成的文件为gif格式,在ACDSEE和PS等可以看到文件大小依然是128*128。这是个很有意思的事情,用ultraedit打开该gif文件,在文件头可以很清楚的看到80 00 80 00的字段,这代表文件大小是128*128,那么为何图像SDK无法识别出这一点呢?答案在这里,仔细阅读gif89a的规范,此外,可以利用一个叫做GIF Movie Gear的软件来打开gif文件,可以发现原来该gif文件后边几帧,因为实际象素小于128*128,所以存在一个相对第一帧的逻辑x,y偏移,gif的不同帧之间的数据以“00 2c”相隔,紧跟这2个字节之后的数据就是逻辑x,y偏移。可以根据“00 2c”用一个很简单的文件读取操作来获取该值。
    这样,利用该x,y偏移,辅助Imagemagick,从原始gif动画中提取每一帧的图片,用它们跟第一帧的数据融合之后,就可以看到后边几帧的真实数据。
举例如下:
原始gifa动画

第一帧数据

第二帧jpg格式

第二帧gif格式

不利用x,y逻辑偏移将第二帧跟第一帧合并得到的图像

利用x,y逻辑偏移将第二帧跟第一帧合并从而得到第二帧所应该的效果


阅读(2796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~