System.Drawing Grafik in ASP.NET Seite einbinden

Quarkz

Grünschnabel
Hallo,

ich habe folgendes Problem:

Ich generiere mit C# mittels GDI (also System.Drawing ) eine Grafik, die ich in einem MemoryStream speichere. Diese GRafik wird dynamisch durch diverse Werte erzeugt und soll innerhalb der Seite als Bild angezeigt werden.

Das Problem ist, wenn ich mit Response die generierte Grafik zurückschicke, nur das Bild angezeigt wird. Gibt es hier eine sinnvolle Möglichkeit mit Response zu arbeiten, bzw. gibt es eine Möglichkeit:

1. Das System.Drawing.Image an ein Panel zu binden
2. System.Drawing.Image in System.Web.UI.....Image zu konvertieren?
3. Irgend eine andere Idee?

Das Bild nach der generierug als xyz.jpeg zu speichern und dann einzubinden kommt leider nicht in Frage.

Würde mich sehr über ideen und anregungen freuen, da ich mir hier schon oft die Zähne ausgebissen habe!

Schonmal vielen dank
 
hmmmm
ich habe genau das selbe Problem...
jetzt freut man sich mal, dass man die Suchfunktion erfolgreich genutzt hat und dann is keine Antwort da ;(
Hat vielleicht noch jemand ne Idee?

Vielleicht nicht ganz genau das selbe, aber ich will Bilder(bzw. derren Pfad) aus ner Datenbank auslesen und sie dann auf der Seite darstellen lassen.
Aber da komm ich ueberhaupt nicht vorran und MSDN verwirrt mich hier irgendwie ziemlich.
 
Zuletzt bearbeitet:
Hallo,

ich hab inzwischen eine eigentlich einfache Lösung gefunden.

Man benötigt einfach zwei aspx Dateien:

1. Die Seite in die das Bild eingebunden werden soll
2. Eine aspx Seite, die das Bild als http Response zurückgibt

In die erste Seite bindet man einfach das Bild ein: z.B:
Code:
<asp:image id="im" Height="400px" Width="400px" Runat="server" ImageUrl="image.aspx"></asp:image>

Die zweite Datei (image.aspx) erstellt jetzt nach belieben ein Bild und gibt dieses zurück.
Durch den http Response mit den Typ image/png verhält sich die aspx Datei dann wie ein
Bild und wird in der ersten Seite angezeigt.

Beispiel:

Code:
Graphics zeichne;
System.Drawing.Image grafik;

public void berechnegrafik(int a, int b,int c, int d)
{
grafik = new Bitmap(400,400);
zeichne = Graphics.FromImage(grafik);
			
Pen stift = new Pen(Color.Red);

zeichne.DrawLine(stift,a,b,c,d); 


MemoryStream tempStream = new MemoryStream();
grafik.Save(tempStream,ImageFormat.Png);

Response.ClearContent();
Response.ContentType = "image/png";
Response.BinaryWrite(tempStream.ToArray());
Response.End();

}

So hat es auf jeden Fall bei mir funktioniert... vielleicht hilft es ein wenig weiter!


Gruß

QuarkZ
 
Zuletzt bearbeitet:
danke schone fuer die schnell Antwort
ich hab nu keine Zeit mehr, hab gleich Feierabend (Singapur +6 Stunden), ich hab so das Gefuehl, dass das nicht ganz auf mein Problem passt.

Eigentlich will ich nur verschieden viele Bilder (abhaengig davon wieviele in der DB eingetragen sind) auf der Seite darstellen.

Irgendwie schaff ich es nicht mal nur ein Bild auf der Seite darzustellen...
 
Hallo.

Ich beschäftige mich zur Zeit beruflich auch mit dem Darstellen von Bildern auf einer .aspx-Seite.
Diese Bilder entnehme ich dynamisch einer SQL-Datenbank, indem ich ein DataSet bei jedem Page_Load-Ereignis von neuem mit allen meinen Kriterien entsprechenden Bildern (und ihren Daten wie Pfad, Name usw.) aus der Datenbank befülle.

Zunächst mal noch ein paar Fragen an dich, um dein Problem genauer zu verstehen:
  • Welche Datenbank benutzt du? SQL, Oracle, Access oder nutzt du XML-Dateien dafür?
  • Wie genau versuchst du, das Bild anzuzeigen? Erzeugst du dazu ein Image-Objekt?

Ein paar mehr Informationen und eventuell etwas Code wären schon hilfreich, um dir helfen zu können... ;)

Gruß, Niko
 
Hi,
ich wuerde dir ja gern Code zeigen, hab aber noch keinen ;(.
Das is ja mein eigentliches Problem, hab mich ein bisschen durch MSDN durchgeklickt und bin irgendwie nicht vorran gekommen.
Eigentlich will ich folgendes:
In eine SQL Datenbank werden die Dateinamen der Bilder eingetragen, beim laden der Seite werden diese dynamisch als Thumbnail auf der Seite erstellt. Beim draufklicken oeffnet sich dann das Bild in gross.
Wie bereits gesagt, hab ich noch keinen grossen Code. Zu den Thumbnails hab ich mir das hier angekuckt http://www.aspheute.com/artikel/20020225.htm.
Aber wie ich abhaengig von der Anzahl der Eintrage in der DB die Bilder auf der Seite darstell, da hab ich irgendwie keinen Ansatz gefunden.

danke fuer die Hilfe!
 
Hallo.

Hmmm... Also ich regle das dynamisch von der Datenbank her immer so,
dass ich alle in Frage kommenden Datensätze in ein DataSet, bzw. eine DataTable schreibe, und das bei jedem Page_Load.
Von dieser kann ich dann z.B. die Anzahl der darinliegenden Bilder zurückgeben lassen.
Mal ein Code-Schnipsel:
Code:
...
using System.Data;
using System.Data.SqlClient;
...
public class ShowBanner : System.Web.UI.UserControl
    {
    ...
    private SqlConnection connection = null;//Leer-Definition einer SqlConnection
    ...
    private void Page_Load(object sender, System.EventArgs e)
    {
    ...
    ZeigeBannerAn();
    ...
    }
    ...
    public void ZeigeBannerAn()
    {
        /* Den folgenden String musst du anpassen, je nachdem wie du mit deinem Server
         * Verbindung aufnimmst. */
        string verbindung = "Server=localhost;TrustedConnection=Yes;Database=Banner";
        connection = new SqlConnection(verbindung);
        connection.Open();

        string sqlQuery = "SELECT banid, bannerlink, dateiname, of_artid"+
                                  ", of_abrechnungsid, clicked "+
	                  "FROM banner "+
		  "WHERE of_artid=1;";
        SqlDataAdapter bannerAdapter = new SqlDataAdapter(sqlQuery, connection);
        
         /* DataTable definieren und befüllen */
        DataSet ds = new DataSet();	                //DataSet instanziieren
        bannerAdapter.Fill(ds,"bannerTabelle");                //DataSet befüllen
        DataTable bannerTabelle = new DataTable();        //DataTable instanziieren
        bannerTabelle = ds.Tables["bannerTabelle"];	//DataTable zuweisen zu DataSet

        /* Inhalt der Datenbank an Variablen übergeben
         * und entsprechend konvertieren.
         * Next() erzeugt hier eine Zufallszahl zwischen 0 und 	
         * der Anzahl der Zeilen in bannerLinkTabelle. */
        Random randomNumber = new Random();
        /* bannerTabelle.Rows.Count gibt die Anzahl der Zeilen zurück */
        int zeilenNummer = randomNumber.Next(0, bannerTabelle.Rows.Count);
        /* banid z.B. ist ein Spaltenname in der Datenbank */
        int bannerID = Convert.ToInt32(bannerTabelle.Rows[zeilenNummer]["banid"]);
        string bannerDateiname = Convert.ToString(bannerTabelle.Rows[zeilenNummer]
                                                                                              ["dateiname"]);
        string bannerLink = Convert.ToString(bannerTabelle.Rows[zeilenNummer]
                                                                                              ["bannerlink"]);
        int ofArtID = Convert.ToInt32(bannerTabelle.Rows[zeilenNummer]["of_artid"]);
        int ofAbrechnungsID = Convert.ToInt32(bannerTabelle.Rows[zeilenNummer]
                                                                                              ["of_abrechnungsid"]);
        long clicked = Convert.ToInt64(bannerTabelle.Rows[zeilenNummer]["clicked"]);
        ...

Hoffe mal, das gibt dir zumindest mal ein paar Ansätze, auch wenn's keine Patentlösung ist. ;)

Gruß, Niko
 
Zurück