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

来源:互联网 发布:推广发布软件 编辑:程序博客网 时间:2024/05/03 13:01

http://www.cnblogs.com/yukaizhao/archive/2008/12/18/1353745.html

 

/// <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);
}

原创粉丝点击