2010-11-19 92 views
0

以下代碼是一個處理程序,它需要用百分比(圖形的顯示爲藍色的百分比),最大值(最大值)和加侖值(數字)來創建溫度計式進度計。它輸出一個添加到網絡表格的圖表,如<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圖層不好(稍微模糊),儘管原圖非常清晰。有沒有辦法保留原件的圖像質量?

非常感謝您的幫助。

回答

0

TempImage.Save(context.Response.OutputStream, ImageFormat.gif);更改爲Jpeg解決了質量問題。

+0

還有什麼我們可以幫忙的嗎?大聲笑。 – Flipster 2010-11-20 00:33:21

0

我相信完成此操作的最佳方法是在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)) 
{ 
    ... 
}