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


    在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, 013);
        
    if ((buf[0!= 71|| (buf[1!= 73|| (buf[2!= 70)) return null//GIF

        fout.Write(buf, 
    013);

        
    int i = 0;
        
    if ((buf[10& 0x80> 0)
        {
            i 
    = 1 << ((buf[10& 7+ 1== 256 ? 256 : 0;
        }

        
    for (; i != 0; i--)
        {
            fin.Read(buf, 
    03);
            
    if ((buf[0== R) && (buf[1== G) && (buf[2== B))
            {
                transparentIdx 
    = (byte)(256 - i);
            }
            fout.Write(buf, 
    03);
        }

        
    bool gcePresent = false;
        
    while (true)
        {
            fin.Read(buf, 
    01);
            fout.Write(buf, 
    01);
            
    if (buf[0!= 0x21break;
            fin.Read(buf, 
    01);
            fout.Write(buf, 
    01);
            gcePresent 
    = (buf[0== 0xf9);
            
    while (true)
            {
                fin.Read(buf, 
    01);
                fout.Write(buf, 
    01);
                
    if (buf[0== 0break;
                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, 01);
            fout.Write(buf, 
    01);
        }
        fin.Close();
        fout.Flush();

        
    return new Bitmap(fout);
    }

    在生成图片之后调用此方法,即可使gif显示透明色。

  • 相关阅读:
    Jump Game II
    Trapping Rain Water
    First Missing Positive
    Median of Two Sorted Arrays
    noip2012开车旅行 题解
    AC自动机专题总结
    初探数位DP
    斯坦纳树 [bzoj2595][wc2008]游览计划 题解
    [bzoj3244][noi2013]树的计数 题解
    网络流模型小结
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/image_save_gif_touming.html
Copyright © 2020-2023  润新知