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)


相关推荐

  • Android 加密 AES

    Android 加密 AESAES加密又称对称性加密,在开发中常用于对流数据对加密,尤其是流数据在网络传输过程中,担心被泄露,AES加密被常用于这块的校验中。下面是AES加密的百度百科说明解释:AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度可以为128、192或256…

  • xshell使用技巧(赚分享平台怎么样)

    Xshell是做什么用的?Xshell使用教程分享前言Xshell的特点Xshell如何远程连接Linux服务器最后分享几个Xshell快捷键前言Xshell是一款功能强大的终端模拟器,支持SSH1,SSH2,SFTP,TELNET,RLOGIN和SERIAL。通过提供业界先进的性能,Xshell包含了其他SSH客户端无法发现的功能和优势,作为新手,可能有很多不明白的地方,今天飞飞简单介绍一下Xshell和连接Linux服务器方法支持SSH1,SSH2,SFTP,TELNET,RLOGIN和SERI

  • session.setAttribute(“key”,value);

    session.setAttribute(“key”,value);1、session.setAttribute(“key”,value);是session设置值的方法,原理同java中的HashMap的键值对,意思也就是key现在为“user”;存放的值为userName,userName应该为一个String类型的变量吧?看你自己的定义。2、可以使用session.getAttribute(“key”);来取值,以为着你能得到userName的值。3、注意…

    2022年10月16日
  • 说一下java的运行机制_Java运行机制是什么?「建议收藏」

    说一下java的运行机制_Java运行机制是什么?「建议收藏」不管是学习Java还是其他什么变成语言,我们不仅要了解它的特性,充分的使用Java语言完成各种程序开发工作,还要了解Java的运行机制。只有了解其底层的运行机制,才能更好的利用Java完成各项工作。Java运行机制是什么?Java程序运行时,必须经过编译和运行两个步骤。首先将后缀名师“.java”的源文件进行编译,最终生成后缀名为“.class”的字节码文件。然后Java虚拟机将编译后的字节码文件…

  • pytest指定用例_ppt怎么设置自定义放映顺序

    pytest指定用例_ppt怎么设置自定义放映顺序前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

  • pyqt5 pycharm配置_pycharm安装pyqt5

    pyqt5 pycharm配置_pycharm安装pyqt5安装Python+PyCharm+PyQt51、安装Python访问官网https://www.python.org/,下载最新版本的Python来安装。我这里下了python3.92、安装PyCharm1)下载PyCharm,官网https://www.jetbrains.com/pycharm/download/#section=windows下载Community版本的2)汉化Pycharm:https://blog.csdn.net/qqwangfan…

发表回复

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

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