向http处理程序添加背景图片

问题描述:

以下代码是一个处理程序,它需要用百分比(图形的显示为蓝色的百分比),最大值(最大值)和加仑值(数字)来创建温度计式进度计。它输出一个添加到网络表格的图表,如<img src="Thermometer.ashx" alt="" />向http处理程序添加背景图片

由于此图旨在显示节省的加仑水的进度,因此用蓝色填充水桶图像会很好。要做到这一点,我试图添加一个透明的内部桶图像的网页形式,并试图把它放在温度计图像的前面,但这没有奏效,因为它似乎不可能将图像分层创建使用处理程序。

我的问题是这样的:是否可以通过代码添加桶形图像,以便用作蓝色温度计的轮廓?还是桶代码需要在代码中从头开始创建?我担心后者,因为我可能无法编写它。

请看下面,让我知道如果有什么我可以做的。

谢谢!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Drawing; 
using System.Net; 
using System.Drawing.Imaging; 
using System.Web.UI.HtmlControls; 
namespace rainbarrel 
{ 
    public class Thermometer : IHttpHandler 
    { 
     public bool IsReusable 
     { 
      get { return false; } 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      int Percent = 25; 
      int Max = 20000; 
      bool Gallon = true; 
      float Pixels = (float)Percent * 2.15f; 
      Bitmap TempImage = new Bitmap(200, 250); 
      Graphics TempGraphics = Graphics.FromImage(TempImage); 
      TempGraphics.FillRectangle(Brushes.White, new Rectangle(0, 0, 200, 250)); 
      Pen TempPen = new Pen(Color.Black); 
      BarrelFill(TempImage, Percent); 
      bool DrawText = true; 
      float Amount = Max; 
      for (float y = 20.0f; y < 235.0f; y += 10.75f) 
      { 
       TempGraphics.DrawLine(TempPen, 119, y, 125, y); 
       if (DrawText) 
       { 
        Font TempFont = new Font("Arial", 8.0f, FontStyle.Regular); 
        if (Gallon) 
        { 
         TempGraphics.DrawString(Amount.ToString() + " Gal", TempFont, Brushes.Black, 130, y); 
        } 
        else 
        { 
         TempGraphics.DrawString(Amount.ToString(), TempFont, Brushes.Black, 130, y); 
        } 
        DrawText = false; 
       } 
       else DrawText = true; 
       Amount -= ((Max/100) * 5.0f); 
      } 

      string etag = "\"" + Percent.GetHashCode() + "\""; 
      string incomingEtag = context.Request.Headers["If-None-Match"]; 

      context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime().AddDays(1)); 
      context.Response.Cache.SetCacheability(HttpCacheability.Public); 
      context.Response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0)); 
      context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
      context.Response.Cache.SetETag(etag); 

      if (String.Compare(incomingEtag, etag) == 0) 
      { 
       context.Response.StatusCode = (int)HttpStatusCode.NotModified; 
       context.Response.End(); 
      } 
      else 
      { 
       context.Response.ContentType = "image/Gif"; 
       TempImage.Save(context.Response.OutputStream, ImageFormat.Gif); 
       TempImage.MakeTransparent(); 
      } 
     } 

     private void BarrelFill(Bitmap TempImage, int Percent) 
     { 
      if (Percent == 100) 
      { 
       FillRectangle(TempImage, 60, 20, 235); 
      } 
      else 
      { 
       FillRectangle(TempImage, 60, (int)(235.0f - ((float)Percent * 2.15f)), 235); 
      } 
     } 

     private void FillRectangle(Bitmap TempImage, int x, int y1, int y2) 
     { 
      int MaxDistance = 50; 
      for (int i = x - MaxDistance; i < x + MaxDistance; ++i) 
      { 
       for (int j = y1; j < y2; ++j) 
       { 
        float Distance = (float)Math.Abs((i - x)); 
        int BlueColor = (int)(255.0f * (1.0 - (Distance/(2.0f * MaxDistance)))); 
        TempImage.SetPixel(i, j, Color.FromArgb(30, 144, BlueColor)); 
       } 
      } 
     } 
    } 
} 

UPDATE:

我发现这个职位在这里它教我如何解决: overlaying images with GDI+

这里是我的解决方案:

Image Barrel = Image.FromFile("C:\\Inetpub\\wwwroot\\barrel\\barrel_trans.png"); 
      TempGraphics.DrawImage(Barrel, -5, 0, 120, 240); 
      Barrel.Dispose(); 

然而,质量png图层不好(稍微模糊),尽管原图非常清晰。有没有办法保留原件的图像质量?

非常感谢您的帮助。

TempImage.Save(context.Response.OutputStream, ImageFormat.gif);更改为Jpeg解决了质量问题。

+0

还有什么我们可以帮忙的吗?大声笑。 – Flipster 2010-11-20 00:33:21

我相信完成此操作的最佳方法是在C#中创建整个图像并将其发送出去。您可以在“温度计”上获得桶的精确定位,并且如果桶已经是(半)透明的PNG,您可以在恒温器上执行一个.DrawImage,添加文本并在发送回去之前执行任何操作最终的图像直接进入ResponseStream。

一种你其他几个建议:

既然你是在你的处理器直接交给的一切,你应该处理自己的内部一次性资源。 “使用”块是最简单的方法。您将需要至少两个:

using (Graphics TempGraphics = GetGraphicsFromBitmap(TempImage)) 
{ 
    for (float y = 20.0f; y < 235.0f; y += 10.75f) 
    { 
     TempGraphics.DrawLine(TempPen, 119, y, 125, y); 
     ... 
    } 
} 

using (Font TempFont = new Font("Arial", 8.0f, FontStyle.Regular)) 
{ 
    ... 
}