要使用asp.net动态输出透明gif图片,也就是用Response.ContentType = "image/GIF"。
查了国内几个中文资料都没解决,最后是在一个英文博客上找到一个可以用的办法。
http://www.codedblog.com/2007/08/28/generating-a-transparent-gif-image-using-c/
他的解决代码是:


//
存成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 ;}}
}
<% @ 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 >
< 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 >