请教解析GIF文件的问题

anothervip 2006-07-11 10:15:26
请问如何处理89a中的Disposal Method(扩展块0x21 0xF9),其中的STAY, BACKGROUND COLOR, BACK PREVIOUS。现在要在嵌入式平台实现功能,做过的兄弟请赐教。
...全文
379 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppzine 2006-07-12
  • 打赏
  • 举报
回复
codeproject上有一个gif解码的工程,你可以下来看看,不过代码有点bug,线程控制好像有问题
anothervip 2006-07-12
  • 打赏
  • 举报
回复
谢谢 ringphone(临风),有个小问题:trans_index=(int)*lpGifData*3+2; 为什么要乘3+2 ?我在文档里没查到,thanks
ringphone 2006-07-12
  • 打赏
  • 举报
回复
sorry,是这样的,因为GIF文件调色板数据是rrggbb格式,不能用COLORREF*指针指向该数据,只能是LPBYTE类型,因此取颜色就需要索引*3,*3+2是我程序代码里加的,因为我程序中设置透明色的代码就是类似SetKeyColor(RGB(gPal[trans_index],gPal[trans_index-1],gPal[trans_index-2]));
ringphone 2006-07-12
  • 打赏
  • 举报
回复
乘3+2得到透明色索引,gif89a文档里有的啊。
sssn 2006-07-11
  • 打赏
  • 举报
回复
阿牛哥也来混分?你可不是这种人啊!
WecanHuang 2006-07-11
  • 打赏
  • 举报
回复
不懂
帮顶
sssn 2006-07-11
  • 打赏
  • 举报
回复
当你有一天冲到那个级别了,你才发现问问题已经不好开口了
sssn 2006-07-11
  • 打赏
  • 举报
回复
楼上明显是混分冲双星
mynamelj 2006-07-11
  • 打赏
  • 举报
回复
不懂,帮顶!
ringphone 2006-07-11
  • 打赏
  • 举报
回复
重帖一遍
0x21F9是图象控制扩展,应该把解码出的一幅图象加入到图象序列列表中,绘制动画时根据控制扩展的设置进行绘制。
设lpGifData为读入的图象文件数据,检测到0x21F9,lpGifData移到下一字节:
if(*lpGifData == 0x21)
{
lpGifData++;
if(*lpGifData == 0xF9)
{
BYTE docase;
BOOL trans;
WORD delay;
int trans_index;

lpGifData+=2;

docase = (BYTE)(((*lpGifData)>>2)&0x07);

trans=(*lpGifData)&1;
lpGifData++;
delay=*(WORD*)lpGifData;
lpGifData+=2;

if(trans)
trans_index=(int)*lpGifData*3+2;
}
}

根据解码出的值,如果trans_index有值,需要给解码出的这幅图象设置透明色,如果该图象有自己的调色板,trans_index为该调色板
的索引颜色,否则采用全局调色板。delay*10为该图象的显示时间(ms),主要是docase的值决定了该幅图象的绘制方式:
0,1:保持图象,绘制动画GIF应该先根据图象创建一幅内存图象,动画序列中的图象都先画到内存图象然后再显示。0,1值表示将当前的图象绘制到内存图象,其实一般动画GIF中都会有设定背景图象的docase为0或1,当前的图象绘制到内存图象,如果该图象是背景其实就是把背景图象恢复了。
2:恢复成背景色,以背景色填充整幅图象
3:恢复前一图象,即送显。
ringphone 2006-07-11
  • 打赏
  • 举报
回复
0x21F9是图象控制扩展,应该把解码出的一幅图象加入到图象序列列表中,绘制动画时根据控制扩展的设置进行绘制。
设lpGifData为读入的图象文件数据,检测到0x21F9,lpGifData移到下一字节:
if(*lpGifData == 0x21)
{
lpGifData++;
if(*lpGifData == 0xF9)
{
BYTE docase;
BOOL trans;
WORD delay;
int trans_index;

lpGifData+=2;

docase = (BYTE)(((*lpGifData)>>2)&0x07);

if(处理方式 == 0x3)
需要绘制背景图象

trans=(*lpGifData)&1;
lpGifData++;
delay=*(WORD*)lpGifData;
lpGifData+=2;

if(trans)
trans_index=(int)*lpGifData*3+2;
}
}

根据解码出的值,如果trans_index有值,需要给解码出的这幅图象设置透明色,如果该图象有自己的调色板,trans_index为该调色板
的索引颜色,否则采用全局调色板。delay*10为该图象的显示时间(ms),主要是docase的值决定了该幅图象的绘制方式:
0,1:保持图象,绘制动画GIF应该先根据图象创建一幅内存图象,动画序列中的图象都先画到内存图象然后再显示。0,1值表示将当前的图象绘制到内存图象,其实一般动画GIF中都会有设定背景图象的docase为0或1,当前的图象绘制到内存图象,如果该图象是背景其实就是把背景图象恢复了。
2:恢复成背景色,以背景色填充整幅图象
3:恢复前一图象,即送显。
anothervip 2006-07-11
  • 打赏
  • 举报
回复
"http://www.vckbase.com/document/viewdoc/?id=1535" 谢谢 allenhiman(9Ft) 和各位帮顶的朋友。

我目前可以显示GIF动画,但是动画中各个图片叠加是不知道该怎么做,比如这个帖子最上面的广告,“1000多页的业务需求”,图片中没有定义透明色,但是叠加的时候有透明效果(书是一幅幅叠加上去的)。

另外,有的图片会出现倾斜扭曲,为什么会这样啊

有用标准C实现的吗?
mynamelj 2006-07-11
  • 打赏
  • 举报
回复
我是不懂,我也不是为分而顶
allenhiman 2006-07-11
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1535

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧