实现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"。
下面是测试代码:
Code [http://www.xueit.com]
//存成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文件如下
Code [http://www.xueit.com]
<!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>
精彩图集
精彩文章
热门标签
表单设计
水印效果
找零钱
RC
mutimap
的小问题
很不错的
Oracle索引
置顶
两个日期
SendKey
题的
lvs
用户过多
Mempodipper本
VC6.0
复杂度
安装教程
分页存储过程
高性能优化
curl存储cookie
给定类
图片去色
分割函数
空隙
限制返回字段
字符串反转
集合
SBIT
First_Value
php环境配置
php时间戳转换
isinstance
影像
fadeTo
创建数据表
工具栏
jsp,dwr,级联
编译错误信息
Web安全
双向循环链表
Read-only
去除
激活验证
java变量
驱动器
义和
PHP SPS Dis
java网络编程
汉诺塔问题
二分查找
watch机制
Cocos2d-x
文件抓取
php构造函数
__setattr__
截取图片
常常出现的
Schema表
误删数据
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229

