asp.net 动态输出透明gif图片_asp.net教程-查字典教程网
asp.net 动态输出透明gif图片
asp.net 动态输出透明gif图片
发布时间:2016-12-29 来源:查字典编辑
摘要:查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。他的解决代码是:代码复制代码代码如下://存成gif.ashxus...

查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。

他的解决代码是:

代码

复制代码 代码如下:

//存成gif.ashx

<%@ WebHandler Language="C#" %>

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>

<img src="gif.ashx" />下方的文字

</body>

</html>

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新asp.net教程学习
    热门asp.net教程学习
    编程开发子分类