发布时间:2025-12-09 13:48:55 浏览次数:4
在C#中使用Graphics.Clear(Color.Transparent)生成gif格式透明文件时,设置透明不起作用。使用Bitmap.MakeTransparent 方法同样也不能使gif文件透明。这两个问题也是微软的设计使然,和gif文件格式有关系。
如果要在c#中编程实现透明色,必须另写代码,下面是一位老外的代码
/// MemoryStreamfin
=
new
MemoryStream();
bitmap.Save(fin,System.Drawing.Imaging.ImageFormat.Gif);
MemoryStreamfout
=
new
MemoryStream((
int
)fin.Length);
int
count
=
0
;
byte
[]buf
=
new
byte
[
256
];
byte
transparentIdx
=
0
;
fin.Seek(
0
,SeekOrigin.Begin);
//
header
count
=
fin.Read(buf,
0
,
13
);
if
((buf[
0
]
!=
71
)
||
(buf[
1
]
!=
73
)
||
(buf[
2
]
!=
70
))
return
null
;
//
GIF
fout.Write(buf,
0
,
13
);
int
i
=
0
;
if
((buf[
10
]
&
0x80
)
>
0
)
{
i
=
1
<<
((buf[
10
]
&
7
)
+
1
)
==
256
?
256
:
0
;
}
for
(;i
!=
0
;i
—
)
{
fin.Read(buf,
0
,
3
);
if
((buf[
0
]
==
R)
&&
(buf[
1
]
==
G)
&&
(buf[
2
]
==
B))
{
transparentIdx
=
(
byte
)(
256
–
i);
}
fout.Write(buf,
0
,
3
);
}
bool
gcePresent
=
false
;
while
(
true
)
{
fin.Read(buf,
0
,
1
);
fout.Write(buf,
0
,
1
);
if
(buf[
0
]
!=
0x21
)
break
;
fin.Read(buf,
0
,
1
);
fout.Write(buf,
0
,
1
);
gcePresent
=
(buf[
0
]
==
0xf9
);
while
(
true
)
{
fin.Read(buf,
0
,
1
);
fout.Write(buf,
0
,
1
);
if
(buf[
0
]
==
0
)
break
;
count
=
buf[
0
];
if
(fin.Read(buf,
0
,count)
!=
count)
return
null
;
if
(gcePresent)
{
if
(count
==
4
)
{
buf[
0
]
|=
0x01
;
buf[
3
]
=
transparentIdx;
}
}
fout.Write(buf,
0
,count);
}
}
while
(count
>
0
)
{
count
=
fin.Read(buf,
0
,
1
);
fout.Write(buf,
0
,
1
);
}
fin.Close();
fout.Flush();
return
new
Bitmap(fout);
}
在生成图片之后调用此方法,即可使gif显示透明色。