服务器之家

服务器之家 > 正文

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

时间:2019-06-25 17:27     来源/作者:ASP.NET之家
查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。
他的解决代码是: 

代码 
复制代码代码如下:

//存成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> 
标签:

相关文章

热门资讯

叠猫猫队长可以退出吗 叠猫猫队长怎么换队伍
叠猫猫队长可以退出吗 叠猫猫队长怎么换队伍 2019-06-05
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
淘宝合合卡可以送好友吗 淘宝合合卡快速获得方式
淘宝合合卡可以送好友吗 淘宝合合卡快速获得方式 2019-06-13
叠猫猫可以邀请多少人 叠猫猫大挑战一个队最多多少人
叠猫猫可以邀请多少人 叠猫猫大挑战一个队最多多少人 2019-06-05
淘宝618叠猫猫怎么退出队伍?每天可退出几次队伍
淘宝618叠猫猫怎么退出队伍?每天可退出几次队伍 2019-06-06
返回顶部