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显示透明色。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162716.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电商新宠—广告电商,转化产品的流量聚体地「建议收藏」

    电商新宠—广告电商,转化产品的流量聚体地「建议收藏」现在市面上通过看广告赚点零花钱的项目也是片地一把抓,在各大平台看广告,间接给平台赚钱,却不能给自己带来一些好处;而真正的并没有让消费者能长期的去坚持去做,一个月下来看广告收益也就十多二十元块钱,使大多数平台变得暗淡下去,最后无人问津。目前又听说在市面上流传了一个很火热的广告变现模式——广告电商,结合了“社交电商+广告分佣”,通过在平台购买商品,赠送同等或者一定量的积分,达到不同的门槛,可以根据不同的积分门槛看不同的广告(每天3分钟),实现广告变现,提现到微信、支付宝和对接的第三方支付服务平台。最终实现广告主

    2022年6月22日
    34
  • VirtualBox下安装ubuntu server 16.04

    VirtualBox下安装ubuntu server 16.04

    2021年10月28日
    45
  • Model、ModelMap和ModelAndView的使用详解

    Model、ModelMap和ModelAndView的使用详解1.前言最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。这两者之间…

    2022年7月25日
    18
  • pycharm中html怎么运行_pycharm如何调试代码

    pycharm中html怎么运行_pycharm如何调试代码PyCharm调试程序,cmd中输入的变量怎么设置PyCharm调试程序,cmd中输入的变量的设置方法CMDdos定义变量,DOS下也只有环境变量可以用;SET[variable=[string]]variable指定环境变量名。string指定要指派给变量的一系列字符串。要显示当前环境变量,键入不带参数的SET。使用pycharm添加py文件,怎么调试PyCharm安装1…

    2022年8月25日
    3
  • Ubuntu16.04安装ros_nodejs安装教程

    Ubuntu16.04安装ros_nodejs安装教程Ubuntu16.04安装ROS详解1、设置sources.list2、设置key3、更新package4、安装ROSkinetic完整版5、初始化rosdep6、配置ROS环境7、安装依赖项8、测试ROS是否安装成功1、设置sources.listsudosh-c’echo&amp;amp;quot;debhttp://packages.ros.org/ros/ubuntu$(lsb_release-…

    2022年9月3日
    2
  • 计算机毕业设计Java校园租赁系统的设计与实现(源码+系统+mysql数据库+Lw文档)[通俗易懂]

    计算机毕业设计Java校园租赁系统的设计与实现(源码+系统+mysql数据库+Lw文档)[通俗易懂]计算机毕业设计Java校园租赁系统的设计与实现(源码+系统+mysql数据库+Lw文档)计算机毕业设计Java校园租赁系统的设计与实现(源码+系统+mysql数据库+Lw文档)最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品可领qu参考你的选题刚好在下面有,有时间看到机会给您发【1】 jspNBA篮球资讯网 【2】 ssm社区便捷管理系统 【3】 ssm阳明湖风景区订票系统 【4】 ssm农家乐信息平台 【5】 ssm+sqlserv

    2022年6月11日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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