龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

实现ASP.NET动态输出透明gif图片的方法

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
使用asp.net动态输出透明gif图片,也就是用Response.ContentType = "image/GIF"。 下面是测试代码: Code [http://www.xueit.com] // 存成gif.ashx % @ WebHandler Language = " C# " Class = " Gif " % using System.IO; using Sy

使用asp.net动态输出透明gif图片,也就是用Response.ContentType = "image/GIF"。

下面是测试代码:

Code [http://www.xueit.com]
//存成gif.ashx
<%@ WebHandler Language="C#" Class="Gif" %>
using System.IO;
using System.Web;
using System.Drawing;

public class Gif : IHttpHandler {

    /// <summary>
    /// Returns a transparent background GIF image from the specified Bitmap.
    /// </summary>
    /// <param name="bitmap">The Bitmap to make transparent.</param>
    /// <param name="color">The Color to make transparent.</param>
    /// <returns>New Bitmap containing a 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);
    }

    public void ProcessRequest(HttpContext context) {
        Bitmap transGif = null;
        using (Bitmap bmp = new Bitmap(300, 50)) {
            using (Graphics g = Graphics.FromImage(bmp)) {
                g.Clear(Color.Gray);
                g.DrawString("transparent gif image", 
                    new Font("verdana bold", 14f), Brushes.LemonChiffon, 0f, 0f);
                bmp.MakeTransparent(Color.Gray);
                transGif = MakeTransparentGif(bmp, Color.Black);
            }
        }
        if (transGif != null) {
            context.Response.Clear();
            context.Response.ContentType = "image/GIF";
            transGif.Save(context.Response.OutputStream,
                System.Drawing.Imaging.ImageFormat.Gif);
        }
    }
    public bool IsReusable {get {return false;}}
}

测试html文件如下

Code [http://www.xueit.com]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body style="background:#999">
<img src="gif.ashx" style="position:absolute" />下方的文字
</body>
</html>
精彩图集

赞助商链接