实现ASP.NET动态输出透明gif图片的方法
使用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"。
下面是测试代码:

//存成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>
精彩图集
精彩文章
热门标签
JQuery源码分析
java图片验证码
pickle类库
PHPThumb
多继承
推荐一篇利用th
哈弗曼编码
onchange事件
抓取豆瓣
this
执行超时
数据库优化
空模块
连接
数据重定向
旧的内核
wifi信号
目的
excel无法打开
Captcha
屏幕录像机
实体修改
Fragmen
基本结构
Apache性能优化
手电筒
样式
SQL语句练习
FORALL
解析乱码
Web页面
jquery插件开发
msyql
post请求
raw_input
定时删除
mysql5.6
版图遍历
消息队列
padding
限制返回字段
ORM框架
counta
翻墙
数组深度
handle
linux运维
FFMPEG
excel
伪协议
动态行
下载进度
传递机制
数据统计
语言包
cl
E
查看时
RAID
UMASK
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229