C#中保存Gif文件设置透明无效果

C#中保存Gif文件设置透明无效果在C#中使用Graphics.Clear(Color.Transparent)生成gif格式透明文件时,设置透明不起作用。使用Bitmap.MakeTransparent方法同样也不能使gif文件透明。这两个问题也是微软的设计使然,和gif文件格式有关系。如果要在c#中编程实现透明色,必须另写代码,下面是一位老外的代码/// <summary>/// Make the i…

大家好,又见面了,我是你们的朋友全栈君。

在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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号