asp.net动态输出透明gif图片

返回C#与Java社区
0回复贴,共1页,点击数:1400
asp.net动态输出透明gif图片要使用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>
1楼 2009/12/27 08:55
您未登录,没有发贴权限[点此登录]