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

查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。

http://www.codedblog.com/2007/08/28/generating-a-transparent-gif-image-using-c/

他的解决代码是:

代码

//存成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 = ;
        byte[] buf = new byte[];
        byte transparentIdx = ;
        fin.Seek(, SeekOrigin.Begin);
        //header
        count = fin.Read(buf, , );
        if ((buf[] != ) || (buf[] != ) || (buf[] != )) return null; //GIF
        fout.Write(buf, , );
        int i = ;
        if ((buf[] & 0x80) > ) {
            i =  << ((buf[] & ) + ) ==  ?  : ;
        }
        for (; i != ; i--) {
            fin.Read(buf, , );
            if ((buf[] == R) && (buf[] == G) && (buf[] == B)) {
                transparentIdx = (byte)( - i);
            }
            fout.Write(buf, , );
        }
        bool gcePresent = false;
        while (true) {
            fin.Read(buf, , );
            fout.Write(buf, , );
            if (buf[] != 0x21) break;
            fin.Read(buf, , );
            fout.Write(buf, , );
            gcePresent = (buf[] == 0xf9);
            while (true) {
                fin.Read(buf, , );
                fout.Write(buf, , );
                if (buf[] == ) break;
                count = buf[];
                if (fin.Read(buf, , count) != count) return null;
                if (gcePresent) {
                    if (count == ) {
                        buf[] |= 0x01;
                        buf[] = transparentIdx;
                    }
                }
                fout.Write(buf, , count);
            }
        }
        while (count > ) {
            count = fin.Read(buf, , );
            fout.Write(buf, , );
        }
        fin.Close();
        fout.Flush();
        return new Bitmap(fout);
    }

public void ProcessRequest(HttpContext context) {
        Bitmap transGif = null;
        using (Bitmap bmp = new Bitmap(, )) {
            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文件如下


<!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>

asp.net动态输出透明gif图片的更多相关文章

  1. asp.net 动态压缩、切割图片,并做缓存处理机制

    在asp.net中,新建一个handler,把需要切割的网内图片,通过调用此URL来切割并缓存.http://localhost:53829/CacheImage/ResizeImage.ashx?s ...

  2. PHP 动态输出 svgz 格式图片

    使用PHP动态生成SVGZ图片(gzip压缩的SVG) 经测试SVG的动画性能很差,简单的动画CPU都能占到 30%左右. 可能的用途: 动态天气图片 访问统计计数图片 文字验证生成 动态头像 静态外 ...

  3. php 合并图片 (将活动背景图片和动态二维码图片合成一张图片)

    <?php //案例一:将活动背景图片和动态二维码图片合成一张图片 //图片一 $path_1 = './background.png'; //图片二 $path_2 = './FU0851_2 ...

  4. ASP.NET 动态编译、预编译和 WebDeployment 项目(转)

    概述 在 Web 服务器上,既可以部署源文件,也可以部署编译后程序集. 若部署源文件,则当用户访问时,Web 应用程序会被动态编译,并缓存该程序集,以便下次访问. 否则,若部署程序集,Web 应用程序 ...

  5. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  6. 在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片

    在"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传"一文中,使用JSAjaxFileUploader这款插件实现了单文 ...

  7. 【转载】使用Response.WriteFile输出文件以及图片

    Response对象是Asp.Net应用程序中非常重要的一个内置对象,其作用为负责将服务器执行好的信息输出给客户端,可以使用Response.WriteFile方法来像客户端输出文件或者图片,输出图片 ...

  8. 利用box-shadow实现伪边框透明到图片

    前阵子突然看到了一个效果,一张图片,有一个边框,但是边框可以透明到图片.直接上图 贴代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  9. asp.net 动态添加自定义控件

    前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...

随机推荐

  1. SQL的主键和外键

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

  2. nginx 日志怎么实现显示真实客户端IP

    这篇文章页不错: http://www.tuicool.com/articles/E32mYf 假如说我们现在的架构是,nginx做反向代理,apache做web服务器.那么我们怎么让我的web服务器 ...

  3. Html-Css-div标签设定-剧中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. C语言结构体的初始化

    今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; ...

  5. 【bzoj4010】 HNOI2015—菜肴制作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4010 (题目链接) 题意 给出一张无向图要求出一个拓扑序列满足1的位置最靠前 ,在保证上面的条件下使 ...

  6. POJ3579 Median

    Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...

  7. C++ Standard Template Library STL(undone)

    目录 . C++标准模版库(Standard Template Library STL) . C++ STL容器 . C++ STL 顺序性容器 . C++ STL 关联式容器 . C++ STL 容 ...

  8. 我和NLP的故事(转载)

    正值ACL录用结果发布,国内的老师和同学们又是一次大丰收,在这里再次恭喜所有论文被录用的老师和同学们!我人品爆发,也收获了自己硕士阶段的第二篇ACL论文.本来只是想单纯分享下自己中论文的喜悦,但没成想 ...

  9. php-fpm.conf两个至关重要的参数

    这里规定了PHP-CGI的连接.发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误.最关键的是php-fpm.conf的设置,这个会直接导致50 ...

  10. C/S B/S 及WEB工作原理

     一.C/S B/S区别 (http://wenku.baidu.com/link?url=e8bxaqz_lYCXws6TlDRJEq1qsLumNTBhr3Es6eA1ZuhHhq9FZGbVgo ...