要使用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. AngularJs-指令和控制器交互

    前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...

  2. 一套简单可依赖的Javascript库

    还是[百度]的产品——Tangram不是我偏心,百度不是我亲戚这东西看上去确实不错 Tangram是一套简单可依赖的Javascript库,主要分为Base和Component两部分.Base提供了开 ...

  3. 每天一个linux命令(9):nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  4. struts2支持的结果类型

    在struts2-core.jar/struts-default.xml中,我们可以找到关于result-type的一些配置信息,从中可以看出struts2组件默认为我们提供了这 些result-ty ...

  5. new-nav-css

    header:before, header:after ,.navigation:before, .navigation:after,.nav-row:before, .nav-row:after,. ...

  6. php 判断是否get传值的参数是否存在

    if(is_array($_GET)&&count($_GET)>0)//先判断是否通过get传值了    {        if(isset($_GET["id&qu ...

  7. iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组

    一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数   GCD的优势 G ...

  8. 【BZOJ 3282】Tree Link Cut Tree模板题

    知道了为什么要换根(changeroot),access后为什么有时要splay,以及LCT的其他操作,算是比较全面的啦吧,,, 现在才知道这些,,,真心弱,,, #include<cstdio ...

  9. Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec . Offending class: javax/servlet/Servlet ...

  10. Java设计模式-代理模式(Proxy)

    其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...