当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net 动态输出透明gif图片

ASP.NET
.NET:InTheHand提供的类操作SMS
捕捉WPF应用程序中XAML代码解析异常
学习asp.net之SQL语句查询效率和安全性
一个不被flash、select、activex遮挡的、跨frame的无限分级菜单
探索 ASP.NET Futures
MSDN Visual系列:创建SharePoint Services解决方案包
.net中如何给数据表实体类赋值的方法
关于C#静态构造函数的几点说明
经典教程:用.net动态创建类的实例
ASP.NET 遍历配置文件的连接字符串
ASP.Net中利用CSS实现多界面两法
ASP.NET生成静态HTML页面并分别按年月目录存放
如何在ASP.net(C#)下操作XML文件
技巧应用:ASP.Net中的MD5加密
三层架构各层间的访问过程
asp.net初学者:petshop4.0设计说明
asp.net利用RAR实现文件压缩解压缩
.NET2.0抓取网页全部链接
给初学.net的您几点建议
如何实现ASP.NET网站个性化

ASP.NET 中的 asp.net 动态输出透明gif图片


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 58 ::
收藏到网摘: n/a

要使用asp.net动态输出透明gif图片,也就是用Response.ContentType = "image/GIF"。 查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。
他的解决代码是:
代码
复制代码 代码如下:

//存成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文件如下
复制代码 代码如下:

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