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)
上一篇 2022年7月21日 上午11:00
下一篇 2022年7月21日 上午11:00


相关推荐

  • OpenClaw风险全链路分析及安全提示

    OpenClaw风险全链路分析及安全提示

    2026年3月14日
    1
  • Manus AI多语言手写识别技术全解析:从模型架构到实战部署

    Manus AI多语言手写识别技术全解析:从模型架构到实战部署

    2026年3月15日
    2
  • docker中启动mysql_win10启动项命令

    docker中启动mysql_win10启动项命令前提:已经装好了mysql镜像官方推荐必须使用密码故命令为:dockerrun–namemysql01-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.5但是没有做端口开放,外界访问不到!故先停止这个容器:在启动加了端口映射的mysqldockerrun-p3306:3306–namemysql02-eMYSQL_R…

    2022年10月6日
    8
  • Teradata SQL基础

    Teradata SQL基础HELP 帮助用户了解数据库中各种对象的结构 SHOW 帮助用户了解某种对象的定义 即返回其 DDL 语句 EXPLAIN 返回一个 SQL 语句经优化处理后的执行步骤 FALLBACK 对数据加以保护的一种方式 是冗余的备份 RENAME 对表重命名 NULLIFZERO 对数据作累计处理时 忽略零值 ZEROIFNULL 对数据作累计处理时 将空值作零处理 WITH BY 对详细数据

    2026年3月17日
    1
  • C语言typedef详解

    C语言typedef详解在 C 还是 C 代码中 typedef 都使用的很多 typedef 与 define 有些相似 其实是不同的 基本定义 typedef 为 C 语言的关键字 作用是为一种数据类型定义一个新名字 这里的数据类型包括基本数据类型 int char 也包括自定义的数据类型 struct 1 与 define 的区别 typedef 有点像 define 宏 其实际类型替代同义字 不同点是 typedef 在编译时被解释

    2026年3月19日
    2
  • idea右边maven模块不见了解决办法

    idea右边maven模块不见了解决办法今天重装了 idea 发现右边的 maven 数据库模块不见了 在网上找了一些方法 如 https blog csdn net zhouyingge11 article details 也没解决 最后自己瞎捣鼓出来了 记录下 1 maven 模块不见了 如图 2 找到右下角这个图标 如图 3 鼠标右击 出现很多菜单模块 如图 4 点击 Mavenp

    2026年3月17日
    2

发表回复

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

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