ASP.NET Image zur Laufzeit ändern.



  • Hallo zusammen.

    Ich habe kürzlich (Vorgestern xD) Angefangen, mir den Visual Web Developer und ASP.NET ein bisschen anzuschauen. Ich möchte nämlich mein Mandelbrotmengenvisualisierer "online stellen".

    Dabei bin ich auf ein Problem gestossen. Ich möchte das Bild, nach dem es berechnet wurde, natürlich anzeigen. Ich dachte, dazu nehme ich ein "Image". Das Programm wird über ein Event informiert, wenn das Bild berechnet wurde. An dieser Stelle habe ich versucht, dass Bild über die ImageUrl-Property des Images anzuzeigen. Aber das will nicht klappen, was auch immer ich versuche. Die Antworteten, die mir Google geliefert hat, funktionieren leider auch nicht.

    Ich habe vor, einen UserControl zu gestalten, auf dem das ganze abläuft. Bis jetzt befindet sich nur das Image darauf. Hier der Code:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using MyMath.Fractals;
    using ImFormat = System.Drawing.Imaging.ImageFormat;
    
    namespace WebFractal
    {
        public partial class FractalPanel : System.Web.UI.UserControl
        {
            Fractal f;
            String ImagePath = "";
    
            protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            protected void PanelBackground_Load(object sender, EventArgs e)
            {
                this.f = new Mandelbrot((Int32)this.MImage.Width.Value, (Int32)this.MImage.Height.Value);
                this.f.Iterations = 100;
                this.f.CalculationFinished += new MyMath.Fractals.Events.CalculationFinishedHandler(Fractal_CalculationFinished);
                this.f.StartCalculation();
            }
    
            private void Fractal_CalculationFinished(Fractal Sender)
            {
                this.ImagePath = System.IO.Path.GetTempFileName();
                this.f.Image.Save(this.ImagePath, ImFormat.Jpeg);
                this.MImage.ImageUrl = this.ImagePath;
            }
        }
    }
    

    Ich wäre sehr dankbar für Hilfe 🙂
    Lasst es mich wissen, wenn ihr zusätzliche Informationen benötigt.



  • Mal so nebenbei.
    Der Browser läuft auf dem Client. Der Server generiert ein Bild. Der Browser hat aber auf den Pfad des Servers keine Zugriff. Der Browser kann nur eine URL aufrufen.
    Dein Bild muss also als URL vorliegen.
    Wie macht man das nun in ASPNET? Man erstellt eine Handler.

    Dieser wird aufgerufen und liefert das Bild.



  • Wie gesagt, bin ein völliger Anfänger auf diesem Gebiet 🙂

    Ich dachte, das Bild wird im Temp-Ordner des Clienten gespeichert, was nach ersten Tests auch der Fall zu sein scheint. Kann ich also als Image nur Bilder, die auf einem Server liegen, mittels url anzeigen? Ist es nicht möglich, dass Bild aus dem Temp-Ordner des Clienten heraus anzuzeigen?

    Ich habe es auch mit einem x-beliebigen Bild, dass ich über Google gefunden habe, ausprobiert. Das hat auch funktioniert, falls ich die ImageUrl im Page_Load Event zugewiesen habe. Ich glaube, als ich dieselbe Codezeile ins Calculation_Finished Event gesetzt habe, hat es nicht mehr funktioniert. Ich kann das im Moment leider nicht noch einmal testen, werde es am Abend noch einmal versuchen. Kann es sein, dass die ImageUrl nur an gewissen "Stellen" gesetzt werden kann? (Habe diesbezüglich leider auch keine Infos gefunden).



  • Ok, es funktioniert nun. Danke für den Hinweis auf Handler 🙂
    Ich habe festgestellt, dass es im Codebehind keine Membervariabeln "gibt". Man kann zwar welche definieren, aber die behalten ihren Wert nicht. Wenn ich die Variablen als static markiere klappts. Ist dass der übliche Weg? Oder sollte man dass anders machen?

    :: edit ::
    Ich habe vorschnell geantwortet: es klappt, aber nur, wenn die ImageUrl-Zuweisung in einem Standard-Event (z.b. Page_Load oder Button_Click) vorgenommen wird. Mache ich dass in meinem eigenen Fractal_CalculationFinished-Event, passiert hingegen nichts, der Handler wird gar nicht erst aufgerufen.. Kann mir irgendjemand erklären, wie ich dass anstellen kann?

    mfg


Log in to reply