找回密码
 注册
搜索
查看: 2641|回复: 17

[讨论] gif透明色部分为何显示白色,高手指点

[复制链接]
发表于 2007-12-22 18:38:02 | 显示全部楼层 |阅读模式
底层是单帧墙纸,上面再叠加gif图片。上面叠的是单帧gif,透明色区域是正常透过去的,但
上面叠的是多帧gif时,透明色区域显示为白色。(注:gif的透明区域是用gif本身的透明色,
并非MTK平台预定的透明色(比如黑色))
尝试过用透明色区域为黑色(平台约定的)的多帧GIF,结果黑色未透过去,还是显示黑色。
请高手指点下
 楼主| 发表于 2007-12-22 18:39:12 | 显示全部楼层
墙纸为单帧gif
点评回复

使用道具 举报

发表于 2007-12-22 21:13:47 | 显示全部楼层
[em01]
点评回复

使用道具 举报

 楼主| 发表于 2007-12-23 02:55:48 | 显示全部楼层
跟踪发现多帧gif,播放第一帧时,也是透过去的,从第二帧起,透明部分变成白色的
点评回复

使用道具 举报

发表于 2007-12-23 17:57:02 | 显示全部楼层
如果你去查MTK的文档,他会告诉你,动画GIF,不支持透明背景

当然,这个通过修改那个GIF解码器,应该可以有所改善
点评回复

使用道具 举报

 楼主| 发表于 2007-12-23 18:21:38 | 显示全部楼层
snaileo ,谢谢!
我现在的情况不是透明的背景,背景是静态的单帧gif(无透明区域), 上面叠加的才是有透明区域的动画gif,
请问这也不支持吗?在哪个文档提到?
点评回复

使用道具 举报

发表于 2007-12-23 19:13:58 | 显示全部楼层
我说的背景,是指动画GIF的背景,而不是你在代码里逻辑上的背景

具体那篇文档有点记不清了,大概是关于resource的文档
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 10:31:14 | 显示全部楼层
跟踪到了GIF的解码函数,MTK平台是支持动画GIF叠加的,是图片的问题。
解码函数果真在刷第二帧以后,刷了矩形,本意在于清除显示区域(和图片大小的尺寸),避免显示第二帧的时候与上一帧重叠。问题就在于清屏时,用的是颜色表里的背景索引色,这里是白色。如果是平台的透明色,那问题就解决了。我单步跟踪到这里时,强制把清屏颜色赋值为平台的透明色,播放的时候,就没有白块,显出透明效果了。
顺便提一下,估计MTK的GIF解码函数还不是很完善,因为05C和06A的解码函数有些差异,比如在什么条件下要清屏。

现在还有个问题,如何修改图片索引表里的背景索引色? (从试验的情况看,这个背景索引色和GIF自身的透明色应该不同,因为它是256色里面的值)
点评回复

使用道具 举报

发表于 2007-12-25 12:39:40 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><B>以下是引用<I>weever</I>在2007-12-25 10:31:14的发言:</B>
跟踪到了GIF的解码函数,MTK平台是支持动画GIF叠加的,是图片的问题。
解码函数果真在刷第二帧以后,刷了矩形,本意在于清除显示区域(和图片大小的尺寸),避免显示第二帧的时候与上一帧重叠。问题就在于清屏时,用的是颜色表里的背景索引色,这里是白色。如果是平台的透明色,那问题就解决了。我单步跟踪到这里时,强制把清屏颜色赋值为平台的透明色,播放的时候,就没有白块,显出透明效果了。
顺便提一下,估计MTK的GIF解码函数还不是很完善,因为05C和06A的解码函数有些差异,比如在什么条件下要清屏。

现在还有个问题,如何修改图片索引表里的背景索引色? (从试验的情况看,这个背景索引色和GIF自身的透明色应该不同,因为它是256色里面的值)</DIV><P>

我来详细说一下我所知道的吧,没有全部跟MTK确认过,有些只是自己调试的结果:
1. MTK的静态GIF解码基本上没有遇到过大的问题,唯一的,在06A的版本上,曾经遇到过一张颜色数很少的静态GIF图片,在解码后出现异常,现象是多出来一条黑线,咨询过MTK,得到的答案是可能为GIF解码器的BUG,无果,后来换图片解决
2.&#160;MTK的动画GIF解码不支持透明背景,这个背景是指动画GIF的背景(如果不清楚这点,那么最好看看GIF编码规范),这点有相应的MTK文档说明,也得到MTK的确认(06A肯定是这样的,07A看样子也是不支持的),原因是这样的(没有跟MTK确认过):在解码动画GIF的过程中,有一个命令是恢复背景,如果这个背景是不透明的(就是MTK支持那种动画GIF),那么很简单,直接重画GIF背景就可以了,如果这个背景是透明的(就是MTK不支持的那种啦),那么就麻烦了,层的原始背景已经被前面GIF帧破坏了,已经无法恢复了,而透明的换一种说法就是恢复原始背景,目前MTK的解码器无能为力了,那怎么办?它有个默认处理方式,就是用GIF的背景索引色来画,本来这张动画GIF告诉编码器,这个背景索引色是透明的,它的实际颜色是无意义的,不是用来画的,但是MTK的编码器没有办法啊,硬是画了出来,结果就看到了一个白色矩形背景在那里。

现在解释一下你看到的现象:你用平台透明色来强制替代GIF背景色就看到了想要的效果,没错,但有个前提,你用来话动画GIF的层本身就是透明层,这就正好满足了GIF解码的要求。

下面是一些可能的改进:
1. 可能是最完美的改善方式,是在开始画这个动画GIF的时候,就把层背景给缓存起来,等到要画GIF背景的时候,用缓存的层内容恢复背景,当然,缺点是缓存需要空间,对于很大的动画GIF,资源受限,所以,我只这么想过,但没有真的试过,呵呵
2. 一个退而求其次的方法,在恢复背景的时候,用动画边缘的层颜色来填充背景,这种方法,如果你的层颜色是单色或者透明的,效果同上,如果层是图片填充的,那么效果差点,但是总体来说,效果还是非常不错的,这可是我独创的方法,不知道是不是也有人在这样做,呵呵

罗嗦了这么多,如果有不对的地方,少拍我几下啊~
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 13:06:24 | 显示全部楼层
非常感谢 snaileo ,能否留个联系方式,或者你加我(QQ: 815276712),大家交个朋友。

我说下我的想法,你提到

如果这个背景是透明的(就是MTK不支持的那种啦),那么就麻烦了,层的原始背景已经被前面GIF帧破坏了,已经无法恢复了,而透明的换一种说法就是恢复原始背景,目前MTK的解码器无能为力了,那怎么办?它有个默认处理方式,就是用GIF的背景索引色来画,本来这张动画GIF告诉编码器,这个背景索引色是透明的,它的实际颜色是无意义的,不是用来画的,但是MTK的编码器没有办法啊,硬是画了出来,结果就看到了一个白色矩形背景在那里。

白色矩形是去背景索引色取65535,我单步强制成31(平台透明色转16位后得到的值),就不出来白矩形了,而是透过去了。

我是想在背景索引色这里找突破口
1.能否用工具改背景索引色?能的话,把他改成平台的透明色,透明效果应该可以出来,我单步试过。但能否用工具改这位色,还有怎么改,这是我不清楚的。
2.改解码函数的,清屏函数,写死,用平台透明色刷矩形,既达到清屏目的,透明又不影响图片原本的颜色。但解码函数MTK本意是不让用户改,编译不了,可能是没加入编译的定义文件吧。
点评回复

使用道具 举报

发表于 2007-12-25 13:18:28 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><B>以下是引用<I>weever</I>在2007-12-25 13:06:24的发言:</B>
非常感谢 snaileo ,能否留个联系方式,或者你加我(QQ: 815276712),大家交个朋友。

我说下我的想法,你提到

如果这个背景是透明的(就是MTK不支持的那种啦),那么就麻烦了,层的原始背景已经被前面GIF帧破坏了,已经无法恢复了,而透明的换一种说法就是恢复原始背景,目前MTK的解码器无能为力了,那怎么办?它有个默认处理方式,就是用GIF的背景索引色来画,本来这张动画GIF告诉编码器,这个背景索引色是透明的,它的实际颜色是无意义的,不是用来画的,但是MTK的编码器没有办法啊,硬是画了出来,结果就看到了一个白色矩形背景在那里。

白色矩形是去背景索引色取65535,我单步强制成31(平台透明色转16位后得到的值),就不出来白矩形了,而是透过去了。

我是想在背景索引色这里找突破口
1.能否用工具改背景索引色?能的话,把他改成平台的透明色,透明效果应该可以出来,我单步试过。但能否用工具改这位色,还有怎么改,这是我不清楚的。
2.改解码函数的,清屏函数,写死,用平台透明色刷矩形,既达到清屏目的,透明又不影响图片原本的颜色。但解码函数MTK本意是不让用户改,编译不了,可能是没加入编译的定义文件吧。</DIV><P>

你可能还是没有理解我说的这一段:

现在解释一下你看到的现象:你用平台透明色来强制替代GIF背景色就看到了想要的透明效果,没错,但有个前提,你用来话动画GIF的层本身就是透明层,这就正好满足了GIF解码的要求

如果你要做修改,建议可以采用我现在用的方法,也就是我上面提到的第二种方式
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 13:22:50 | 显示全部楼层
谢谢你的好建议!

我这里的动画GIF层是有透明区域和实体区域的,单步演示效果还不错。可惜不懂有没有工具改图片的背景索引色。
点评回复

使用道具 举报

发表于 2007-12-25 13:35:14 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><B>以下是引用<I>weever</I>在2007-12-25 13:22:50的发言:</B>
谢谢你的好建议!

我这里的动画GIF层是有透明区域和实体区域的,单步演示效果还不错。可惜不懂有没有工具改图片的背景索引色。</DIV><P>

如果你的动画GIF是有透明区域的,也就是说它的背景是透明的,再改它的背景色,好像没有意义吧?
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 13:42:29 | 显示全部楼层
原先的问题就是播放这样的图片,透明区域有是白色,原因就是你说的刷了白色矩形,刷了白色矩形再画有透明是gif,看到的效果还是有白色。现在就是想避免白色的出现。

还有,我那种说法,就是图片里带了两种透明色,一种是图片的透明区域是gif的透明色(PS看到是花格式那种),另一个背景索引色想改成平台透明色。
点评回复

使用道具 举报

发表于 2007-12-25 13:52:48 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><B>以下是引用<I>weever</I>在2007-12-25 13:42:29的发言:</B>
原先的问题就是播放这样的图片,透明区域有是白色,原因就是你说的刷了白色矩形,刷了白色矩形再画有透明是gif,看到的效果还是有白色。现在就是想避免白色的出现。

还有,我那种说法,就是图片里带了两种透明色,一种是图片的透明区域是gif的透明色(PS看到是花格式那种),另一个背景索引色想改成平台透明色。</DIV><P>

刷白色矩形的过程就是画透明背景的过程,只是因为MTK的解码器不支持透明背景的缘故,刷了个白色矩形出来

画动画GIF里面单帧的过程跟话静态GIF应该是差不多的,不存在问题,支持透明,问题是MTK的解码器对动画GIF的透明背景不支持,它透明背景,也就是你说的那个背景索引色画成了白色

如果你非要通过更改图片的方式来解决这个问题,那么可以试试Firework这个工具,虽然我觉得这不是个解决的办法
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 14:02:50 | 显示全部楼层
我跟解码函数的情况是,画第一帧前不刷矩形,然后显示第一帧,这就解释了单帧GIF能透过去,和多帧GIF,第一帧透过去(断点控制让刷了第一帧后,程序停下来)。
第二帧以后要刷矩形gdi_draw_solid_rect,是为了清屏,避免后面的帧与上一帧重叠。这样看来,画透明背景的过程不是刷白色矩形的过程。
点评回复

使用道具 举报

发表于 2007-12-25 14:12:04 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><B>以下是引用<I>weever</I>在2007-12-25 14:02:50的发言:</B>
我跟解码函数的情况是,画第一帧前不刷矩形,然后显示第一帧,这就解释了单帧GIF能透过去,和多帧GIF,第一帧透过去(断点控制让刷了第一帧后,程序停下来)。
第二帧以后要刷矩形gdi_draw_solid_rect,是为了清屏,避免后面的帧与上一帧重叠。这样看来,画透明背景的过程不是刷白色矩形的过程。</DIV><P>

呵呵,建议还是拿个GIF规范来看看吧,然后你就可以理解GIF解码器里那些COMMAND的意义了
点评回复

使用道具 举报

 楼主| 发表于 2007-12-25 14:13:45 | 显示全部楼层
好的,谢谢 !
我试试 Firework
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-26 00:15 , Processed in 0.046435 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表