目标:处理gif的时候,需要提取每帧的透明色。
这个问题困扰偶n长时间了,一直没搞定。
比如我自己做了一个gif图片,全局背景色是黑色,第一帧透明色是白色,但是黑色在第一帧里面是有用的象素,我的目标是找出第一帧的透明色,然后把第一帧中和透明色相同的颜色换掉(在处理中,我只需要第一帧,此时第一帧已经被我转换成bmp了),我在测试的时候,只能得到gif.BackgroundColor,但是这个颜色是全局透明色!!
搞定问题,另开贴,500分,绝不食言。
本贴先给100分作为参与者鼓励,如参与人数多,再加分(兄弟最多能加到200)。
这个问题困扰偶n长时间了,一直没搞定。
比如我自己做了一个gif图片,全局背景色是黑色,第一帧透明色是白色,但是黑色在第一帧里面是有用的象素,我的目标是找出第一帧的透明色,然后把第一帧中和透明色相同的颜色换掉(在处理中,我只需要第一帧,此时第一帧已经被我转换成bmp了),我在测试的时候,只能得到gif.BackgroundColor,但是这个颜色是全局透明色!!
搞定问题,另开贴,500分,绝不食言。
本贴先给100分作为参与者鼓励,如参与人数多,再加分(兄弟最多能加到200)。
那你查查它的帮助和看看DEMO..自己试试那些属性,应该有的...
我的函数如下:
{-----------------------------------------------------------------------------
函数名称: GetGifSubmitTransColor
作者 : yang
日期 : 2004-11-9 12:39:29
参数 : GifPath: string; acMap: TGifColorMap
返回值 : TColor
功能 : 根据传入的gif文件路径和gif颜色列表返回符合gif89a标准的第一帧透明色
-----------------------------------------------------------------------------}
function TPlusObject.GetGifSubmitTransColor(GifPath: string;
acMap: TGifColorMap): TColor;
var
ms : TMemoryStream;
i : Integer;
buf : array[0..7] of Byte;
begin
Result:= -1;
ms:= TMemoryStream.Create;
ms.LoadFromFile(GifPath);
//笨办法,通过查找扩展控制块标记$21完成查找透明色的功能。
for i:=0 to ms.Size-9 do
begin
ms.Position:= i;
ms.read(buf,8);
if (buf[0]=$21) and (buf[7]=$0) then
begin
//根据gif89a的定义,这个地方的buf[6]就是透明色的索引值
if acMap.Count>buf[6] then Result:= acMap.Colors[buf[6]];
break;
end;
end;
ms.Free;
end;