2010-11-19 10 views
0

Der folgende Code ist ein Handler, der einen Prozentsatz (Prozent des Diagramms als blau), Max (Maximalwert) und einen Gallonenwert (Zahl) zur Erstellung eines Thermometers annimmt -Style Fortschrittsanzeige. Es gibt ein Diagramm aus, das zu einem Webformular als <img src="Thermometer.ashx" alt="" /> hinzugefügt wird.Hinzufügen einer Hintergrundgrafik zum http-Handler-Image

Da dieser Graph den Fortschritt als die Anzahl der Gallonen Wasser speichern soll, wäre es schön, wenn die blaue Farbe ein Wasserfassbild füllt. Dazu habe ich versucht, dem Webformular ein Fassbild mit einem transparenten Inneren hinzuzufügen und es vor dem Thermometerbild zu positionieren, aber das hat nicht funktioniert, da es unmöglich erscheint, ein Bild über ein mit einem Bild erzeugtes zu legen ein Handler.

Meine Frage ist: Ist es möglich, das Fass Bild durch Code hinzugefügt, so dass dient als Umriss für das blaue Thermometer? Oder muss das Fassbild im Code neu erstellt werden? Ich fürchte letztere, da ich es wahrscheinlich nicht programmieren kann.

Bitte sehen Sie unten und lassen Sie mich wissen, ob es etwas gibt, was ich tun kann.

Vielen Dank!

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:

fand ich diesen Beitrag hier die mir zeigte, wie zu lösen: overlaying images with GDI+

Hier ist meine Lösung:

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

jedoch die Qualität der Die Png-Schicht ist schlecht (leicht verschwommen), obwohl das Original sehr scharf und klar ist. Gibt es eine Möglichkeit, die Bildqualität des Originals zu erhalten?

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Das Ändern TempImage.Save(context.Response.OutputStream, ImageFormat.gif); zu Jpeg löste das Qualitätsproblem.

+0

Gibt es noch etwas können wir Ihnen helfen? lol. – Flipster

0

Ich glaube, dass der beste Weg, dies zu erreichen, wäre, das gesamte Bild in C# zu erstellen und es abzuschicken. Sie können die exakte Position des Laufs über dem "Thermometer" erreichen, und wenn der Lauf bereits ein (halb) transparentes PNG ist, können Sie einfach ein .DrawImage direkt über dem Thermostat machen, Text hinzufügen und alles tun, was Sie wollen das endgültige Bild direkt in den ResponseStream.

Ein paar andere Vorschläge für Sie:

Da Sie alles direkt in Ihrem Handler übergeben werden, sollten Sie Ihre eigenen internen Einweg-Ressourcen verfügen. "Verwenden" -Blöcke sind der einfachste Weg. Sie benötigen mindestens diese zwei:

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

und

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