大家好,又见面了,我是你们的朋友全栈君。
在C#中使用Graphics.Clear(Color.Transparent)生成gif格式透明文件时,设置透明不起作用。使用Bitmap.MakeTransparent 方法同样也不能使gif文件透明。这两个问题也是微软的设计使然,和gif文件格式有关系。
如果要在c#中编程实现透明色,必须另写代码,下面是一位老外的代码
<summary>
///
Make the image transparent.
///
The input is the color which you want to make transparent.
///
</summary>
///
<param name=”color”>
The color to make transparent.
</param>
///
<param name=”bitmap”>
The bitmap to make transparent.
</param>
///
<returns>
New memory stream containing transparent background gif.
</returns>
public
Bitmap MakeTransparentGif(Bitmap bitmap, Color color)
{
byte
R
=
color.R;
byte
G
=
color.G;
byte
B
=
color.B;
MemoryStream fin
=
new
MemoryStream();
bitmap.Save(fin, System.Drawing.Imaging.ImageFormat.Gif);
MemoryStream fout
=
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显示透明色。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162716.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...