要使用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. 每天一个linux命令(32):wc命令

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  2. JSP/SERVLET入门教程--Servlet 使用入门

    现在的JSP书籍有的是直接讲述JSP的使用,然后再讲解SERVERLET的使用;也有书籍是先讲述SERVERLET的使用,然后讲解JSP使用.个人认为第二种相对好一些,至于原因大家可以在学习体会到!所 ...

  3. Active-MQ的安装

    (1)首先就是下载软件 wget http://archive.apache.org/dist/activemq/apache-activemq/5.9.0/apache-activemq-5.9.0 ...

  4. Vijos p1518 河流 转二叉树左儿子又兄弟

    左儿子又兄弟的转发一定要掌握啊,竞赛必用,主要是降低编程复杂度,省时间.个人觉得状压DP也是为了降低编程复杂度. 方程就不说了,程序应该能看得懂,用的记忆化搜索,方便理解. #include<c ...

  5. [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。

    学习asp.net mvc 时在更新实体进行SaveChanges()的时候出现了异常,异常如下: “/”应用程序中的服务器错误. 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能 ...

  6. Java编程思想学习(一) 一切都是对象

    前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...

  7. Uva11300 Spreading the Wealth

    设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程. 设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱).计算出最后每个人应该有的钱m,解方 ...

  8. servlet 中 web.xml

    <servlet> <servlet-mapping> 他们之间的关系可以使一对一,也可是一对多的关系. <servlet> <servlet-name> ...

  9. Selenium2+python自动化13-Alert

    不是所有的弹出框都叫alert,在使用alert方法前,先要识别出它到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决.alert\confirm\prompt弹出框 ...

  10. [Python] Python 之 __new__() 方法与实例化

    __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() ...